【发布时间】:2011-06-10 00:31:30
【问题描述】:
阅读一本书,我遇到了这段代码...
# 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 类?因为我没有明确告诉它。人(模块不同于人(类)
非常感谢任何帮助:)
【问题讨论】:
-
嗯,要么代码是旧的或坏的,要么我看不出它背后的技巧。但我会让
Manager类继承自Person。但我真的不明白你的问题。你说你知道getattr在做什么。至于为什么它委托给self.person:我没有写这段代码,所以我只能假设Manager是Person。在构造函数中创建了一个新的Person。 -
这是非常古老的代码:它不是
object的子类,所以它们是老式类。哦,它坏了:Person.lastName不会为姓“de la Garza”的人返回正确答案。 -
你在看什么书?这看起来写得很糟糕恕我直言......
-
我正在阅读 O Reilly 的学习 Python。我知道这是“坏”代码……他只是想显示 getattr……在正确的代码中,他很好地继承了 Person 类
标签: python python-datamodel getattr