1. 程式人生 > >python3學習筆記 定制類

python3學習筆記 定制類

col pan one rom 不存在 print student AS tee

__str__

class Student(object):
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return Student object (name: %s) % self.name
  __repr__ = __str__

#作用:可以直接打印內部信息
>>> print(Student(Michael)) Student object (name: Michael)

__getattr__

當調用不存在的屬性時,比如score

,Python解釋器會試圖調用__getattr__(self, ‘score‘)來嘗試獲得屬性,這樣,我們就有機會返回score的值:

class Student(object):

    def __init__(self):
        self.name = Michael

    def __getattr__(self, attr):
        if attr==score:
            return 99

>>> s = Student()
>>> s.name
Michael
>>> s.score
99
#返回函數也是完全可以的:
class
Student(object): def __getattr__(self, attr): if attr==age: return lambda: 25
只是調用方式要變為:
>>> s.age()
25

任意調用如s.abc都會返回None,這是因為我們定義的__getattr__默認返回就是None。要讓class只響應特定的幾個屬性,我們就要按照約定,拋出AttributeError的錯誤:

class Student(object):

    def __getattr__
(self, attr): if attr==age: return lambda: 25 raise AttributeError(\‘Student\‘ object has no attribute \‘%s\‘ % attr)

這實際上可以把一個類的所有屬性和方法調用全部動態化處理了,不需要任何特殊手段。

作用實例:

利用完全動態的__getattr__,我們可以寫出一個鏈式調用:

class Chain(object):

    def __init__(self, path=‘‘):
        self._path = path

    def __getattr__(self, path):
        return Chain(%s/%s % (self._path, path))

    def __str__(self):
        return self._path

    __repr__ = __str__




>>> Chain().status.user.timeline.list
‘/status/user/timeline/list‘
這樣,無論API怎麽變,SDK都可以根據URL實現完全動態的調用,而且,不隨API的增加而改變!

__call__

任何類,只需要定義一個__call__()方法,就可以直接對實例進行調用。

class Student(object):
    def __init__(self, name):
        self.name = name

    def __call__(self):
        print(My name is %s. % self.name)


調用方式如下:
>>> s = Student(‘Michael‘)
>>> s() # self參數不要傳入
My name is Michael.

python3學習筆記 定制類