python 學習--定製類

xiaopengyaonixi發表於2016-10-20
# python 定製類
class DStudent(object):
    # 初始化引數,類似於c# 和 java中的建構函式
    # 沒有'_'表示是公有欄位外部可以訪問
    # 一個‘_'表示外部可以訪問但是不建議訪問
    # 兩個'__'表示外部不能訪問
    def __init__(self,name):
        self.__name = name
        self.__count = 0

    # __str__() 和 __repr__(),兩者的區別是__str__()返回使用者看到的字串,而__repr__()返回程式開發者看到的字串,也就是說,__repr__()是為除錯服務的
    def __str__(self):
        return 'Student object (name:%s) and count:%s' % (self.__name,self.__count)

    # 如果一個類想被用於for ... in迴圈,類似list或tuple那樣,就必須實現一個__iter__()方法,該方法返回一個迭代物件,然後,Python的for迴圈就會不斷呼叫該迭代物件的__next__()方法拿到迴圈的下一個值,直到遇到StopIteration錯誤時退出迴圈。
    def __iter__(self):
        return self

    def __next__(self):
        self.__count+= 1
        if self.__count>50:
            raise StopIteration()
        return self

    # 取制定下表的元素
    def __getitem__(self, item):
        self.__count = item
        return self

    # 動態返回屬性
    def __getattr__(self, item):
        if(item=="test"):
            return 'haha'

    # 一個物件例項可以有自己的屬性和方法,當我們呼叫例項方法時,我們用instance.method()來呼叫。能不能直接在例項本身上呼叫呢?在Python中,答案是肯定的。
    def __call__(self, *args, **kwargs):
        print('<-----call---->')

    __repr__ = __str__

s = DStudent('Cp')
print(s)
for n in s:
    print(n)

print('------')
print(s[0])
print(s[1])
print(s[2])

print('------')
print(s.test)

print('------')
s()

相關文章