码迷,mamicode.com
首页 > 其他好文 > 详细

__slots__的食用方式

时间:2018-10-31 01:10:37      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:tee   imp   size   注意   运行   tuple   class   types   允许   

动态语言中通过class创建了实例后,可以给该实例绑定任何方法和属性

class Student(object):
    pass
# 绑定一个属性
s = Student()
s.name = ‘Michael‘ # 动态的给实例绑定一个属性
print(s.name)

def set_age(self, age): # 定义一个函数作为实例(java中叫成员)方法
    self.age = age
        
#  再给Student绑定一个方法    
from types import MethodType
s.set_age_new = MethodType(set_age, s)  # 给实例绑定一个方法
s.set_age_new(25)  # 调用实例方法
print(s.age) # 测试结果

# 但是绑定的方法,对其他的实例不起作用
s2 = Student() # 创建新实例
#  AttributeError: ‘Student‘ object has no attribute ‘set_age_new‘
# s2.set_age_new(23) # 调用绑定的实例方法

# 为了给所有实例都绑定方法,可以给class绑定方法
def set_score(self, socre):
    self.socre = socre

Student.set_score_new = set_score # 为class绑定方法

# 绑定后, 所有的实例都可以调用
s.set_score_new(100)
print(s.socre)
s2.set_score_new(99)
print(s2.socre)
Michael
25
100
99

通常上面set_score() 方法是直接定义在class中,但动态绑定在 允许程序运行过程中给class加上功能,这在静态语言中很难实现

__slots__

如果需要限制属性.比如值允许对Student实例中添加nameage属性,为了实现这一个目的python运行在定义class的时候定义一个特殊的变量__slots__,来限制class实例能添加的属性

class Student(object):
    __slots__ = (‘name‘, ‘age‘) # 用tuple定义运行绑定的属性名称

s = Student()  # 创建新的实例
s.name = ‘Michael‘  # 绑定属性name
s.age = 25  # 绑定属性age
#  AttributeError: ‘Student‘ object has no attribute ‘score‘
# s.score = 99

# tips: 在定义__slots__要注意, 该属性进队当前类的实例起作用,对继承的子类是不起作用的
class GraduateStudent(Student):
    pass
g = GraduateStudent()
g.score = 9999

除非在子类也定义了__slots__,子类实例运行定义的属性就是自身的__slots__加上父类__slots__

__slots__的食用方式

标签:tee   imp   size   注意   运行   tuple   class   types   允许   

原文地址:https://www.cnblogs.com/codycc/p/9880449.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!