2019-05-13
OOP高级编程
1.使用slots(限制动态的给python绑定属性)
class Student(object):
def _init_(self,name,age):
self.name=name
self.age=age
>>>s=student()
>>>s.name='Bestin'
>>>s.gender='man' #动态的给实例绑定一个属性
>>>print(s.name)
bestin
def set_score(self,score):
self.score=score
from types import MethodType
s.set_score=MethodType(set_score,s) #给实例绑定一个方法
>>>s.set_score(25)
>>>s.score
25
<font color='maroon'>给一个实例绑定方法对另一个实例是不起作用的,为了给所有实力都绑定方法,可以给class绑定方法。</font>
def set_score(self,score):
self.score=score
>>>Student.set_score=set_score
>>>s.set_score(100)
>>>s.score
100
class Student(object):
_slots_=('name','age') #用tuple定义绑定的属性名称
>>>s.name='Bestin'
>>>s.age=25
>>>s.score=90
AttributeError
<font color='maroon'>slots定义的属性仅对当前实例起作用,对继承的子类是不起作用的。</font>
2.使用@property(@property装饰器就是负责把一个方法变成属性调用的)
版本一:
class Student(object):
slots=('name','age','score','birth')
def init(self,name,age,score,birth):
self._name=name
self._age=age
self._score=score
self._bitrh=birth
def get_score(self):
rerurn self._score
def set_score(self):
if not isinstance(self._score,int):
print('ValueType is not correct!')
elif self._score<0 or self._score>100
print('score value must be 0`100!')
else:
return self._score
版本二:加上@property(getter,setter,也可以只定以一个)
class Student(object):
@property
def socre(self):
return self._score
@score.setter
def score(self,value):
if not isinstance(value,int):
raise ValueError('score must be aba integer!')
if value<0 or value>100:
raise ValueError('score must between 0`100!')
self._score=value
>>>s=Student()
>>>s.score=60 #实际转化为s.set_score(60)
>>>s.score #实际转化为s.get_score()
60
>>>s.score=9999
ValueError
3.多重继承(即事先定义好类,同时不能一位的分类,这样子类就可以继承很多方法和属性!)
4.定制类(即对类添加一些需要的方法)
形如XXX的变量或者函数名要注意,这些在python中是有特殊用途的。