Python面向对象高级编程-_slots_

使用_slots_

正常情况下,当定义一个class,创建一个class的实例后,可以给实例绑定任何属性和方法,这就是动态语言的灵活性。先定义class:

>>> class Student(object):
    pass

然后,尝试给实例绑定一个属性:

>>> s = Student()
>>> s.name = ‘Michael‘
>>> print s.name
Michael

还可以尝试给实例绑定一个方法:

>>> def set_age(self,age):
    self.age = age

>>> from types import MethodType
>>> s.set_age = MethodType(set_age,s)
>>> s.set_age(25)
>>> s.age
25
>>> 

但是给一个实例绑定的方法,对另一个实例是不起作用的:

>>> s1 = Student()
>>> s1.name = ‘Jack‘
>>> s1.name
‘Jack‘
>>> s1.set_age(24)

Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    s1.set_age(24)
AttributeError: ‘Student‘ object has no attribute ‘set_age‘
>>> 

为了给所有实例都绑定方法,可以给class绑定方法:

>>> Student.set_age = set_age
>>> s1.set_age(24)
>>> s1.age
24
>>> 

通常情况下,上面的set_age方法可以直接定义到class中,但动态绑定允许我们在程序运行过程中动态给class加上功能,这在静态语言中很难实现。

但是,如果很想要限制实例的属性该怎么办?只允许对Student实例添加name和age属性。

为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的_slots_变量,来限制该class实例能添加的属性:

>> class Student(object):
    __slots__ = (‘name‘,‘age‘)

>>> s = Student()
>>> s.score = 99

Traceback (most recent call last):
  File "<pyshell#34>", line 1, in <module>
    s.score = 99
AttributeError: ‘Student‘ object has no attribute ‘score‘
>>> 

除非在子类中也定义__slot__,这样子类实例允许定义的属性就是自身__slots__加上父类的__slot__

时间: 2024-10-08 17:32:12

Python面向对象高级编程-_slots_的相关文章

Python面向对象高级编程:@property--把方法变为属性

为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score()方法里,就可以检查参数: 1 >>> class Student(object): 2 def get_score(self): 3 return self.__score 4 def set_score(self,value): 5 if not isinstance(value,int): 6 raise ValueError('sec

python面向对象高级编程

python中属性和方法的动态绑定  class Student(object):     pass   # 实例化一个对象     s = Student() # 给这个对象绑定一个属性name s.name = 'John'   print(s.name) John   # 定义一个方法 def set_age(self, age):     self.age = age   # 导入模块     from types import MethodType   #给s这个对象绑定一个set_a

Python 面向对象高级编程——使用@property

1.1   使用@property 输入成绩score时,需对这个参数进行检查. >>> class Student(object): ...    def get_score(self): ...        return self.__score ...    def set_score(self, value): ...        if not isinstance(value, int): ...             raise ValueError('score mu

Python 面向对象高级编程——定制类

1.1   定制类 1.1.1   __str__ >>> class Student(object): ...    def __init__(self, name): ...        self.name = name ... >>> s = Student('daidai') >>> s.name 'daidai' >>> Student('daidai').name 'daidai' >>> print(

Python 面向对象高级编程——使用枚举和元类

1.1   使用枚举 基于Enum类实现的枚举 >>> fromenum import Enum >>> Month = Enum('Month', ('Jan','Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')) >>> for name, member inMonth.__members__.items(): ...    print(name,

Python面向对象高级编程[email&#160;protected]

使用@property 在绑定属性时,如果直接把属性暴露出去,虽然写起来简单,但是没法检查参数,导致可以把成绩随便改: >>> class Student(object): pass >>> s =Student() >>> s.score=999 >>> s.score 999 这显然不符合逻辑,为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_s

Python 面向对象高级编程——使用__slots__

1.1   使用__slots__ 1.1.1   类方法的绑定 实例上添加方法 >>> class Student(object): ...    pass ... >>> def set_age(self, age):     #定义函数作为实例方法,注意self参数 ...    self.age = age ... >>> s = Student() >>> fromtypes import MethodType >&g

Python 面向对象高级编程——多重继承

1.1   多重继承 >>> #最大类 ... class Animal(object): ...    pass ... >>> #大类 ... class Mammal(Animal): ...    pass ... >>> class Bird(Animal): ...    pass ... >>> class Runnable(object): ...    def run(self): ...        print(

python基础-面向对象高级编程

实例化对象绑定属性 s.name = 'Michael' # 动态给实例绑定一个属性 类绑定方法---所有实例化对象均可调用Student.set_score = set_score 实例化对象绑定方法---只有该对象可调用from types import MethodType#绑定方法需要使用MethodTypes.set_age = MethodType(set_age, s) # 给实例绑定一个方法 Python内置的@property装饰器就是负责把一个方法变成属性调用的把一个gett