gpt4 book ai didi

python __getattr__ 帮助

转载 作者:行者123 更新时间:2023-12-01 06:13:07 24 4
gpt4 key购买 nike

读一本书,我遇到了这段代码......

# 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__ 函数。我知道它委托(delegate)了 Person 类的所有其他属性。但我不明白它是如何工作的。例如为什么来自 Person 类?因为我没有明确告诉它。人(模块与人(类)不同

非常感谢任何帮助:)

最佳答案

  1. 在您的 __init__ 中你实例化一个Person被分配给 self.person 的对象。

  2. 然后,您可以覆盖 Manager 实例上的属性查找(通过为此类实现 __getattr__),并将这些属性重定向为在 self.person 变量上查找(这是 1 中的 Person 对象)在这种特殊情况下)。

就像 Felix Kling 在评论中提到的那样,制作 Manager 会更有意义。继承自Person 。在上面的当前代码中,看起来经理一个人,而认为经理一个人更符合逻辑。

你可以这样做:

class Person(object):

def __init__(self, name, job=None, pay=0):
self.name = name
self.job = job
self.pay = pay

def give_raise(self, percent):
self.pay = int(self.pay *(1 + percent))

def __str__(self):
return "[Person: %s, %s]" % (self.name, self.pay)

class Manager(Person):

def __init__(self, name, pay):
super(Manager, self).__init__(name, "mgr", pay)

def give_raise(self, percent, bonus=.10):
self.pay = int(self.pay * (1 + (percent + bonus)))

# example usage
John = Person("John", "programmer", 1000)
Dave = Manager("Dave", 2000)
print John, Dave
John.give_raise(.20)
Dave.give_raise(.20)
print John, Dave

关于python __getattr__ 帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4706173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com