Rumah  >  Soal Jawab  >  teks badan

python3,定制类,getattr相关用法

class Chain(object):
    def __init__(self,path=""):
        self._path = path
    def __getattr__(self,path):
        return Chain("%s/%s" %(self._path,path))
    def __call__(self,path):
        return Chain("%s/%s" %(self._path,path))
    def __str__(self):
        return self._path
    __repr__ = __str__
    
print(Chain().a.b.user("Michael").c.d)

看了好久还是理解不了这语句,如能详述一些细节,感激不尽

PHP中文网PHP中文网2717 hari yang lalu496

membalas semua(1)saya akan balas

  • PHPz

    PHPz2017-04-18 10:27:47

    getattr(objek, nama[, lalai])

    
    class Student(object):
        def __init__(self):
            self.name = 'Michael'
        def __getattr__(self,attr):
            return attr
    
            
    s = Student()
    s.name 
        --> 'Michael'
    s.score    
        -->  'score'
        

    _getattr__ ialah fungsi terbina dalam python, yang mengembalikan atribut secara dinamik
    Apabila memanggil atribut yang tidak wujud, Python akan cuba memanggil __getattr__(self,'score') untuk mendapatkan atribut dan mengembalikan skor

    __str__ digunakan untuk mencetak fungsi
    __call__ memanggil kelas sebagai fungsi yang serupa

    Aliran pelaksanaan kod:
    Chain() mencipta contoh, dan laluan pada mulanya menjadi lalai kepada "". Apabila Chain().a, tiada atribut dalam kelas dan penghurai Python memanggil fungsi getattr --> __getattr__ (self,path='a'),
    dan kembalikan contoh Rantaian, kemudian hantar /a tugasan gei laluan masuk, teruskan b, kerana tiada atribut b, jalankan fungsi getattr, lulus / a/b dalam,
    Kemudian .user("Michael") akan mula-mula melaksanakan getattr untuk mengembalikan contoh Rantaian, tetapi kerana terdapat () kurungan, Chain() dikembalikan
    Ini akan memanggil fungsi panggilan. dan kemudian " ChenTian" diluluskan sebagai laluan, dan kemudian fungsi panggilan mengembalikan /a/b/user/ChenTian, ​​​​dan selebihnya adalah serupa.

    .user("Michael”) 刚开始的user被getattr函数捕获,并返回Chain(),然后再执行__call__来调用 "Michael"
    
    

    Carta alir kod

    balas
    0
  • Batalbalas