1.使用slots(第一次写博客下划线打不出来,请看代码):
python是一种动态语言,在正常情况下,我们定义一个类,再创建一个类的实例,我们在运行代码的时候,可以通过给这个实例绑定一个属性或者一个函数来增加这个实例的功能,如下面的例子:
class Dog(object):
pass
def set_name(self,dogname):
self.dogname = dogname
#注意set_name函数不是Dog类的函数
#为dog1这个实例绑定一个 gender属性
dog1 = Dog()
dog1.gender = 'male'
print(dog1.gender)
#为dog1这个实例绑定一个set_name方法
from types import MethodType
dog1.set_name = MethodType(set_name, dog1)
dog1.set_name('XiaoBai')
print('狗1的名字是', dog1.dogname)
'''我们只是为dog1这个实例绑定了新的属性和方法,
所以对Dog这个类的其他实例没有上述绑定的属性和方法'''
dog2 = Dog()
try:
dog2.set_name('XiaoHei')
except AttributeError:
print('Dog2没有set_name这个方法!')
#给Dog类绑定set_name()之后,所有实例都有了set_name这个方法
Dog.set_name = set_name
dog2.set_name('XiaoHei')
print('狗2的名字是', dog2.dogname)
运行结果:
male
狗1的名字是 XiaoBai
Dog2没有set_name这个方法!
狗2的名字是 XiaoHei
>>>
上面的例子可以看出动态语言的特性,所以又有了新的问题,有时候我们需要限制类的动态绑定怎么办?可以使用slots:
class Dog(object):
__slots__ = ('name', 'age')
dog1 = Dog()
dog1.name = 'XioaBai'
dog1.age = 13
print('狗的名字:', dog1.name)
print('狗的年龄:', dog1.age)
try:
gender = 'male'
dog1.gender = gender
print('狗的性别:', dog1.gender)
except AttributeError:
print('不能给dog1绑定gender这个属性')
运行结果:
狗的名字: XioaBai
狗的年龄: 13
不能给dog1绑定gender这个属性
>>>
还有需要注意的地方就是:
这个类的子类如果没定义slots,没有这个绑定限制,但是当子类也定义了slots, 则子类的绑定限制范围是子类的范围加上父类的范围。
ps:不要将slot写成slot,否则没作用,还有就是slots两边都有双下划线,第一次写博客打不出来
-_-!