在读一本书的时候,我发现了这个密码。。。在
# module person.py
class Person:
def __init__(self, name, job=None, pay=0):
self.name = name
self.job = job
self.pay = pay
def lastName(self):
return self.name.split()[-1]
def giveRaise(self, percent):
self.pay = int(self.pay *(1 + percent))
def __str__(self):
return "[Person: %s, %s]" % (self.name,self.pay)
class Manager():
def __init__(self, name, pay):
self.person = Person(name, "mgr", pay)
def giveRaise(self, percent, bonus=.10):
self.person.giveRaise(percent + bonus)
def __getattr__(self, attr):
return getattr(self.person, attr)
def __str__(self):
return str(self.person)
它做了我想要它做的,但是我不理解Manager
类中的__getattr__
函数。我知道它委托了Person
类中的所有其他属性。但我不明白它的工作原理。例如,为什么来自Person
类?我没有明确告诉它。人(模块不同于人(类)
非常感谢您的帮助:)
在您的
__init__
中,实例化了一个分配给的Person
对象自己人.然后重写管理器实例上的属性查找(为此类实现
__getattr__
),并重定向这些属性以在自己人变量(在本例中是来自1的Person
对象)。就像felixkling在评论中提到的,让}继承会更有意义。在上面的当前代码中,经理似乎有一个人,而认为经理是一个人更符合逻辑。在
Manager
从{你可以这样做:
除了阅读一本书,您可能还想咨询The Book,在那里您可以找到关于^{} 方法如何工作的非常清晰的解释。在
简而言之,当没有指定名称的属性附加到要应用它的对象上,也没有附加到对象类或它的任何超类时,就会调用它。换言之,当其他一切都失败时,它就会调用。在
在示例中的代码中,
__getattr_()
的实现有效地将对命名属性的搜索重定向到self.person
对象上,该对象是Person
类的一个实例。在同样重要的是要理解
__getattr_()
是访问与任何对象相关联的数据和方法的第一步。在实际上,您确实显式地告诉它—不是通过命名类,而是通过提供该类的一个实例。在
在
init
方法中,将self.person
绑定到Person
的实例。现在,每个Manager
实例都将有这个数据成员。在在
__getattr__
中,将self.person
作为第一个参数委托给getattr
内建。无论self.person
的类型如何,它都将查找具有给定名称的成员。在相关问题 更多 >
编程相关推荐