Python19 __slots__@property
Posted thloveyl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python19 __slots__@property相关的知识,希望对你有一定的参考价值。
面相对象高级编程:slots、@property
- 给实例绑定属性和方法:正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。
代码:
```
#!usr/bin/env/python3
# -- coding:utf-8 --
class Student(object):
pass
s = Student()# 给实例绑定属性
s.name = "123"
print(‘name‘ in dir(s)) # 判断实例中是否有name这个属性 dir()返回的是对象里所有的方法和属性
print(s.name)# 定义一个方法与实例进行绑定用
def do_func(self):
return ‘me‘# 给实例绑定一个方法
from types import MethodType
s.get_func = MethodType(do_func,s)
print(s.get_func())# 给一个实例绑定的方法,对另一个实例是不起作用的
s1 = Student()
# print(s1.name,s1.get_func())# 给类绑定方法
Student.get_func1 = do_func# 实例调用类方法
print(s.get_func1(),s1.get_func1())# 使用__slots__ 限制能绑定的属性
class Plepeo(object):
slots = (‘name‘,‘age‘) # 用tuple定义允许绑定的属性名称p = Plepeo()
# 使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的:
p.name = ‘123‘
p.age = 12
p.addr = ‘China‘ # 报错:AttributeError: ‘Plepeo‘ object has no attribute ‘addr‘
```
- @property:是负责把一个方法变成属性调用的Python内置装饰器:
代码:
```
class Student1(object):
s1 = Student1()# 把一个getter方法变成属性,只需要加上@property就可以了, # 此时,@property本身又创建了另一个装饰器@score.setter, # 负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性 @property def get_score(self): # 得到属性值 return self._score @get_score.setter def set_score(self,score): # 设置属性值 if not isinstance(score,int): raise TypeError('score is int and <= 100') if score > 100 and score < 0: raise ValueError('score > 0 ,score < 100') self._score = score
# 使用@property将方法变成属性调用
s1.set_score = 100
print(s1.get_score)
```还可以定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性:
以上是关于Python19 __slots__@property的主要内容,如果未能解决你的问题,请参考以下文章
8.python之面相对象part.8(__slots__属性)
python进阶五(定制类)5-7 python中__slots__