2019-05-13
OOP高級編程
1.使用slots(限制動態(tài)的給python綁定屬性)
class Student(object):
def _init_(self,name,age):
self.name=name
self.age=age
>>>s=student()
>>>s.name='Bestin'
>>>s.gender='man' #動態(tài)的給實例綁定一個屬性
>>>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裝飾器就是負責把一個方法變成屬性調(diào)用的)
版本一:
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 #實際轉(zhuǎn)化為s.set_score(60)
>>>s.score #實際轉(zhuǎn)化為s.get_score()
60
>>>s.score=9999
ValueError
3.多重繼承(即事先定義好類,同時不能一位的分類,這樣子類就可以繼承很多方法和屬性!)
4.定制類(即對類添加一些需要的方法)
形如XXX的變量或者函數(shù)名要注意,這些在python中是有特殊用途的。