如果要把乙個類的例項變成str,就需要實現特殊方法__str__():
class person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def __str__(self):
return '(person: %s, %s)' % (self.name, self.gender)
p = person('bob', 'male')
print p
結果為:(person: bob, male)
但是,如果直接敲變數p,結果為:
似乎__str__() 不會被呼叫。
因為 python 定義了__str__()和__repr__()兩種方法,__str__()用於顯示給使用者,而__repr__()用於顯示給開發人員。
有乙個偷懶的定義__repr__的方法:
class person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def __str__(self):
return '(person: %s, %s)' % (self.name, self.gender)
__repr__ = __str__
__cmp__
對int、str等內建資料型別排序時,python的sorted()按照預設的比較函式cmp排序,但是,如果對一組student類的例項排序時,就必須提供我們自己的特殊方法 __cmp__():
class student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def __str__(self):
return '(%s: %s)' % (self.name, self.score)
__repr__ = __str__
def __cmp__(self, s):
if self.name < s.name:
return -1
elif self.name > s.name:
return 1
else:
return 0
l = [student('tim', 99), student('bob', 88), student('alice', 77)]
print sorted(l)
上述 student 類實現了__cmp__()方法,__cmp__用例項自身self和傳入的例項s進行比較,如果self應該排在前面,就返回 -1,如果s應該排在前面,就返回1,如果兩者相當,返回 0。
student類實現了按name進行排序,結果為:[(alice: 77), (bob: 88), (tim: 99)]
__len__
如果乙個類表現得像乙個list,要獲取有多少個元素,就得用len()函式。
要讓len()函式工作正常,類必須提供乙個特殊方法__len__(),它返回元素的個數。
class students(object):
def __init__(self, *args):
self.names = args
def __len__(self):
return len(self.names)
ss = students('bob', 'alice', 'tim')
print len(ss)
@property
考察student類:
class student(object):
def __init__(self, name, score):
self.name = name
self.score = score
s = student('bob', 59)
s.score = 60
顯然,直接給屬性賦值無法檢查分數的有效性。
如果利用兩個方法:
class student(object):
def __init__(self, name, score):
self.name = name
self.__score = score
def get_score(self):
return self.__score
def set_score(self, score):
if score < 0 or score > 100:
raise valueerror('invalid score')
self.__score = score
這種使用get/set方法來封裝對乙個屬性的訪問在許多物件導向程式設計的語言中都很常見。
但是寫s.get_score()和s.set_score()沒有直接寫s.score來得直接。
有沒有兩全其美的方法?----有。
因為python支援高階函式,在函式式程式設計中我們介紹了裝飾器函式,可以用裝飾器函式把get/set方法「裝飾」成屬性呼叫:
class student(object):
def __init__(self, name, score):
self.name = name
self.__score = score
@property
def score(self):
return self.__score
@score.setter
def score(self, score):
if score < 0 or score > 100:
raise valueerror('invalid score')
self.__score = score
s = student('bob', 59)
s.score = 60
print s.score
注意:第乙個score(self)是get方法,用@property裝飾,第二個score(self, score)是set方法,用@score.setter裝飾,@score.setter是前乙個@property裝飾後的副產品。
__slots__
由於python是動態語言,任何例項在執行期都可以動態地新增屬性。
如果要限制新增的屬性,例如,student類只允許新增name、gender和score這3個屬性,就可以利用python的乙個特殊的__slots__來實現。
顧名思義,__slots__是指乙個類允許的屬性列表:
class student(object):
__slots__ = ('name', 'gender', 'score')
def __init__(self, name, gender, score):
self.name = name
self.gender = gender
self.score = score
__slots__的目的是限制當前類所能擁有的屬性,如果不需要新增任意動態的屬性,使用__slots__也能節省記憶體。
乙個類例項也可以變成乙個可呼叫物件,只需要實現乙個特殊方法__call__()。
我們把person類變成乙個可呼叫物件:
class person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def __call__(self, friend):
print 'my name is %s...' % self.name
print 'my friend is %s...' % friend
p = person('bob', 'male')
p('tim')
結果為:
my name is bob...
my friend is tim...
python定製 python中定製類
1 python中 str 和repr 如果要把乙個類的例項變成 str,就需要實現特殊方法 str classperson object def init self,name,gender self.name name self.gender genderdef str self return p...
python中的定製類
str 在python中方法名如果是 x 的,那麼就有特殊的功能,因此叫做 魔法 方法 當使用print輸出物件的時候,只要自己定義了 str self 方法,那麼就會列印從在這個方法中return的資料 class student object def init self,name self.na...
python定製訂單 python 訂製類
str repr iter next getitem getattr 正常情況下,當我們呼叫類的方法或屬性時,如果不存在,就會報錯。比如定義student類 classstudent object def init self self.name michael 呼叫name屬性,沒問題,但是,呼叫不...