1. 程式人生 > >python 面向對象六 動態添加方法 __slots__限制動態添加方法

python 面向對象六 動態添加方法 __slots__限制動態添加方法

obj student back trac pan 對象 blog col imp

一、動態添加屬性

1 >>> class Student(object):
2     pass
3 
4 >>> st = Student()
5 >>> st.name = Jack
6 >>> st.name
7 Jack

二、動態給實例添加方法

 1 >>> from types import MethodType
 2 >>> class Student(object):
 3     pass
 4 
 5 >>> def set_age(self, age):
6 self.age = age 7 8 >>> st.set_age = MethodType(set_age, st) # 給實例綁定一個方法 9 >>> st.set_age(25) 10 >>> st.age 11 25

三、動態給類添加方法

 1 >>> class Student(object):
 2     pass
 3 
 4 >>> def set_score(self, score):
 5     self.score = score
 6 
 7
>>> Student.set_score = set_score 8 >>> s1 = Student() 9 >>> s1.set_score(100) 10 >>> s1.score 11 100 12 >>> s2 = Student() 13 >>> s2.set_score(50) 14 >>> s2.score 15 50

四、限制實例的屬性 __slots__

 1 >>> class Student(object):
 2     __slots__
= (name, age) # 用tuple定義允許綁定對的屬性名稱 3 4 >>> s = Student() 5 >>> s.name = Jack 6 >>> s.age = 20 7 >>> s.score = 100 8 Traceback (most recent call last): 9 File "<pyshell#53>", line 1, in <module> 10 s.score = 100 11 AttributeError: Student object has no attribute score

__slots__定義的屬性僅對當前類實例起作用,對繼承的子類是不起作用的:

1 >>> class GraduateStudent(Student):
2 ...     pass
3 ...
4 >>> g = GraduateStudent()
5 >>> g.score = 9999

除非在子類中也定義__slots__,這樣,子類實例允許定義的屬性就是自身的__slots__加上父類的__slots__:

 1 >>> class GraduateStudent(Student):
 2     __slots__ = (score, )
 3 
 4 >>> g = GraduateStudent()
 5 >>> g.score = 100
 6 >>> g.name = Mike
 7 >>> g.age = 10
 8 >>> g.other = abc
 9 Traceback (most recent call last):
10   File "<pyshell#69>", line 1, in <module>
11     g.other = abc
12 AttributeError: GraduateStudent object has no attribute other

python 面向對象六 動態添加方法 __slots__限制動態添加方法