Python学习之路(面向对象之使用__slots__)
2018-01-05 本文已影响0人
55lover
面向对象高级编程之slots
python 是 动态语言 因此我们可以动态的给实例绑定属性和方法
from types import MethodType # 引入模块
class Student():
pass
dp = Student()
cpy = Student()
dp.name = '邓鹏' # 绑定name 属性
print(dp.name)
def set_age(self, age):
self.age = age
dp.set_age = MethodType(set_age, dp) # 给实例绑定一个方法,但是该方法只对当前实例有用,别的实例是没有该方法的
dp.set_age(24)
print(dp.age) # 24
# print(cpy.age) # AttributeError: 'Student' object has no attribute 'age'
# 为了解决 绑定一个方法,让所有实例都有该方法 那么,我们可以直接绑定到类上
Student.set_age = set_age
dp.set_age(26)
print(dp.age) #26
cpy.set_age(27)
print(cpy.age) #27
# 以上 给实例动态绑定属性和方法 是静态语言很难实现的~
# 使用__slots__ 限制实例的属性 (用在哪儿 限制哪儿, 跟继承没有关系,用在父类限制父类 跟子类没关系 )
# 比如:
class Animal():
__slots__ = ('name', 'height') # 用tuple (str) 来定义 允许绑定的属性名称
def __init__(self, name, height):
self.name = name
self.height = height
monkey = Animal('Person', 135)
monkey.name = 'Monkey'
print(monkey.name) # Monkey
monkey.height = '90'
print(monkey.height)
# monkey.gender = 'male'
# print(monkey.gender) # 报错 tributeError: 'Animal' object has no attribute 'gender'
print('--------------------------')
class Dog(Animal):
pass
kaer = Dog('KAER', 90)
# kaer.name = 'Kaer'
# kaer.height = '20'
kaer.gender = 'male'
print(kaer.gender) # male
print(kaer.name)
print(kaer.height)
小结
使用slots要注意,slots定义的属性仅对当前类实例起作用,对继承的子类是不起作用的:
除非在子类中也定义slots,这样,子类实例允许定义的属性就是自身的slots加上父类的slots。
关注一波!喜欢一波!本人是前端菜鸟,正在做自己的个人博客邓鹏的博客,欢迎来交流学习, 使用的技术 vue + koa2 + mysql + php + nginx!