python getattr帮助

2024-06-08 06:19:30 发布

您现在位置:Python中文网/ 问答频道 /正文

在读一本书的时候,我发现了这个密码。。。在

# 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类?我没有明确告诉它。人(模块不同于人(类)

非常感谢您的帮助:)


Tags: nameselfreturninitdefmanagerjobpay
3条回答
  1. 在您的__init__中,实例化了一个分配给的Person对象自己人.

  2. 然后重写管理器实例上的属性查找(为此类实现__getattr__),并重定向这些属性以在自己人变量(在本例中是来自1的Person对象)。

就像felixkling在评论中提到的,让Manager从{}继承会更有意义。在上面的当前代码中,经理似乎有一个人,而认为经理是一个人更符合逻辑。在

你可以这样做:

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

除了阅读一本书,您可能还想咨询The Book,在那里您可以找到关于^{}方法如何工作的非常清晰的解释。在

简而言之,当没有指定名称的属性附加到要应用它的对象上,也没有附加到对象类或它的任何超类时,就会调用它。换言之,当其他一切都失败时,它就会调用。在

在示例中的代码中,__getattr_()的实现有效地将对命名属性的搜索重定向到self.person对象上,该对象是Person类的一个实例。在

同样重要的是要理解__getattr_()是访问与任何对象相关联的数据和方法的第一步。在

实际上,您确实显式地告诉它—不是通过命名类,而是通过提供该类的一个实例。在

init方法中,将self.person绑定到Person的实例。现在,每个Manager实例都将有这个数据成员。在

__getattr__中,将self.person作为第一个参数委托给getattr内建。无论self.person的类型如何,它都将查找具有给定名称的成员。在

相关问题 更多 >

    热门问题