私は、getattrとsetattr関数を使って、Pythonの委譲の概念を理解しようとしています。基本的な考え方は、Personクラスの属性 'lang'の値をまずProfessionalクラスを通して設定し、それを取得することです。問題は、結果が無限ループであることです。あなたのインスタンスが完全に初期化される前に、Pythonの__setattr__関数
class Person:
def __init__(self,name='Subhayan',job='Engineer',unique='Unique'):
print ("Inside init function of Person")
self.name = name
self.job = job
self.salary = 50000
self.lang = "Perl"
def __setattr__(self,att,value):
self.__dict__[att] = value
class Professional:
job = 'Engineer'
salary = 75000
def __init__(self):
print ("Inside Professional init function")
self.person = Person()
def __getattr__(self,attr):
print ("Calling the getattr function")
return getattr(self.person, attr)
def __setattr__(self,att,value):
# print ("calling the setattr function setting the value of %s to %s" %(attr,value))
self.person.__setattr__(self,att,value)
if __name__ == '__main__':
print ("Calling the script as main")
Prof = Professional()
print ("Salary is",Prof.salary)
print ("name is",Prof.__class__)
print ("Setting the value of lang")
Prof.lang = 'Python'
value = Prof.lang
print ("The value of lang is ;",value)
[OK]を、その場合には、私は専門 –
の__init__メソッド内から人のオブジェクトを初期化することはできませんので、@ SubhayanBhattacharya:できます。なぜあなたはできないと思いますか? – BrenBarn
私はその呼び出しを置き換えることを考えていました:self.person = Person()のようなもの:self .__ dict __ ['person'] = Person()。これは、呼び出しを__setattr__にルーティングすべきではありません。私は正しいですか? –