1. 程式人生 > >python中的內建屬性

python中的內建屬性

"teachclass.py"
class Person(object):
pass

python3.5中類的內建屬性和方法

經典類(舊式類),早期如果沒有要繼承的父類,繼承裡空著不寫的類

#py2中⽆繼承⽗類,稱之經典類,py3中已預設繼承object
class Person:
      pass

子類沒有實現 __init__ 方法時,預設自動呼叫父類的。 如定義 __init__ 方法時,需自己手動呼叫父類的 __init__ 方法

__getattribute__ 例子:

class Itcast(object):
    def __init__(self,subject1):
        self.subject1 = subject1
        self.subject2 = 'cpp'

    #屬性訪問時攔截器,打log
    def __getattribute__(self,obj):
        if obj == 'subject1':
           print('log subject1')
           return 'redirect python'
        else: #測試時註釋掉這2⾏,將找不到subject2
           return object.__getattribute__(self,obj)

    def show(self):
        print('this is Itcast')

s = Itcast("python")
print(s.subject1)
print(s.subject2)

執行結果:

log subject1
redirect python
cpp

__getattribute__的坑

class Person(object):
    def __getattribute__(self,obj):
        print("---test---")
        if obj.startswith("a"):
           rturn "hahha"
        else:
           return self.test

    def test(self):
        print("heihei")

t.Person()
t.a #返回hahha
t.b #會讓程式死掉
    #原因是:當t.b執行時,會呼叫Person類中定義的__getattribute__方法,但是在這個方法的執行過程 
    #中if條件不滿足,所以 程式執行else裡面的程式碼,即return self.test 問題就在這,因為return 需 
    #要把self.test的值返回,那麼首先要獲取self.test的值,因為self此時就是t這個物件,所以 
    #self.test 就是t.test 此時要獲取t這個物件的test屬性,那麼就會跳轉到__getattribute__方法去 
    #執行,即此時產生了遞迴呼叫,由於這個遞迴過程中 沒有判斷什麼時候推出,所以這個程式會永無休  
    #止的執行下去,因為每次呼叫函式,就需要儲存⼀一些資料,那麼隨著呼叫的次數越來越多,最終記憶體吃 
    #光,所以程式崩潰
    #
    # 注意:以後不要在__getattribute__方法中呼叫self.xxxx