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

>>> s.set_age= MethodType(set_age, s)     #给实例s添加方法set_age

>>> s.set_age(24)

>>> s.age

24

>>> s1 = Student()

>>> s1.set_age(24)      --注意其他实例不能调用

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

AttributeError: ‘Student‘ object has noattribute ‘set_age‘

给类绑定方法—动态增加类的方法

>>> defset_score(self, score):

...     self.score = score

...

>>>Student.set_score = set_score

>>> s.set_score(98)

>>> s.score

98

>>> s1.set_score(100)

>>> s1.score

100

1.1.2   使用__slots__

作用限制实例的属性。

>>> class Student(object):

...    __slots__ = (‘name‘, ‘age‘)   #用tuple限制属性名称

...

>>> s = Student()

>>> s.name = ‘daidai‘

>>> s.name

‘daidai‘

>>> s.score = 100

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

AttributeError: ‘Student‘ object has noattribute ‘score‘

注意__slots__只对当前类实例起作用

>>> class Gstudent(Student):

...    pass

...

>>> g = Gstudent()

>>> g.score = 98    --子类仍然可以定义

>>> g.score

98

子类加上__slots__就可同时限制父类和子类的属性名称

>>> class Gstudent(Student):

...    __slots__ = (‘score‘, ‘grade‘)

...    pass

...

>>> g = Gstudent()

>>> g.unslot=898

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

AttributeError: ‘Gstudent‘ object has noattribute ‘unslot‘

>>> g.name = ‘daidai‘

>>> g.name

‘daidai‘

时间: 2024-10-09 21:39:34

Python 面向对象高级编程——使用__slots__的相关文章

【Python】[面向对象高级编程] 使用__slots__,使用@property

1.使用 __slots__    给实例绑定方法, >>> 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 为了给所有的实例都绑定方法,可以给类绑定方

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面向对象高级编程-_slots_

使用_slots_ 正常情况下,当定义一个class,创建一个class的实例后,可以给实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: >>> class Student(object): pass 然后,尝试给实例绑定一个属性: >>> s = Student() >>> s.name = 'Michael' >>> print s.name Michael 还可以尝试给实例绑定一个方法: >>>

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

正常情况下,我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: >>> class Student(object): ... pass 然后尝试给实例绑定一个属性: >>> s = Student() >>> s.name = 'kebi' #新增属性 >>> s.name #打印属性 'kebi' 还可以尝试给实例绑定一个方法: >>&g

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 面向对象高级编程——使用@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