• 动态绑定和__slots__


    # python 是动态编程语言,可以在运行的过程中修改代码,不需要编译就可以直接运行
    # 综合:动态绑定类属性和类方法,对象属性和对象方法
    class Test01(object):
        def __init__(self, name):
            self.name = name
    
        def eat(self):
            print("%s 正在吃放" % self.name)
    
    
    def run(self):
        print("%s 想要奔跑" % self.name)
    
    def play(self):
        print("%s 正在玩耍" % self.name)
    
    
    t1 = Test01("张三")
    print(t1.name)
    
    # 动态添加实例属性
    t1.age = 15
    print(t1.age)
    print("*" * 60)
    
    # 动态添加实例方法,如果直接使用
    # t1.run = run
    # t1.run()
    # 是不对的,为什么呢?run()方法需要传self参数,直接这么写,run()并没有传参数,不是对象t1的实例方法
    # 正解:
    import types
    
    t1.run = types.MethodType(run, t1)
    t1.run()
    print("*" * 60)
    
    # 动态添加类属性(这样所有的对象实例都可以使用这个属性了)
    t2 = Test01("李四")
    t3 = Test01("王五")
    Test01.add = "北京"
    print(t2.add)
    print(t3.add)
    print("*" * 60)
    
    # 动态添加类方法(静态方法也是一样)
    Test01.play = play
    t2.play()
    t3.play()
    print("*" * 60)
    
    
    # 补充:动态删除类属性
    # del 对象.属性名
    # delattr(对象, "属性名")
    
    
    # 补充:如何限定实例对象只能动态的添加某些指定的属性呢?
    # 为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性
    # 注意:使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的
    class Person(object):
        # 必须把name也添加到__slots__,不然会找不到该属性
        __slots__ = ("name", "age", "add")
    
    
    p = Person()
    p.age = 15
    p.add = "长沙"
    print(p.age, "====", p.add)
    # 以上都没有报错,因为name、age、add都是在范围里的
    p.score = 100
    print(p.score)
    # 没有score
  • 相关阅读:
    Berkeley DB(五) 补充
    案例研究–亚马逊服务中断,数据库崩溃–我们恢复数据库且无数据损失
    源代码管理十诫
    menucool
    如何:使用變數視窗將變數加入封裝
    翻转句子中单词的顺序
    【科研论文】新型脉冲电子围栏网络化系统设计
    Java对泛型的支持(二)
    springmvc camel mybatis集成实例及分析
    xtrabackup全备方案,备份恢复全过程记录
  • 原文地址:https://www.cnblogs.com/tangxlblog/p/9948279.html
Copyright © 2020-2023  润新知