动态绑定和__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

 

posted @ 2018-11-12 18:42  人工智能之路上的菜鸡  阅读(175)  评论(0编辑  收藏  举报