1

本を読んで、このコードに出くわしました...

# 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)

やりたいことはできますが、クラスの__getattr__機能がわかりません。クラスManagerから他のすべての属性を委任することを知っています。Personしかし、私はそれがどのように機能するかを理解していません。たとえば、なぜPersonクラスから?はっきり言ってないから。person(module は Person(class) とは異なります

どんな助けでも大歓迎です:)

4

3 に答える 3

2
  1. あなたはself.personに割り当てられるオブジェクトを__init__インスタンス化します。Person

  2. 次に、Manager インスタンスの属性検索をオーバーライドし (__getattr__このクラスに実装することにより)、これらの属性をリダイレクトして、代わりに self.person 変数 (Personこの特定のケースでは 1 からのオブジェクト) で検索されるようにします。

コメントで述べた 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
于 2011-01-16T15:33:46.670 に答える
0

本を読む以外に、メソッドがどのように機能するかについての非常に明確な説明を見つけることができる__getattr__()を調べたいと思うかもしれません。

簡単に言うと、指定された名前の属性が適用されているオブジェクトに関連付けられておらず、オブジェクト クラスまたはそのスーパークラスにも関連付けられていない場合に呼び出されます。つまり、他のすべてが失敗したときに呼び出されます。

例のコードでは、 の実装により__getattr_()、名前付き属性の検索がクラスself.personのインスタンスであるオブジェクトに効果的にリダイレクトされます。Person

__getattr_()これが、オブジェクトに関連付けられたデータとメソッドの両方にアクセスするための最初のステップであることを理解することも重要です。

于 2011-01-16T22:08:59.110 に答える
0

実際には、クラスに名前を付けるのではなく、そのクラスのインスタンスを提供することによって、明示的に伝えます。

メソッドでは、 のインスタンスにinitバインドします。これで、すべてのインスタンスがこのデータ メンバーを持ちます。self.personPersonManager

では、最初の引数として をビルトインに__getattr__委譲しています。のタイプに関係なく、指定された名前のメンバーが検索されます。getattrself.personself.person

于 2011-01-16T15:32:07.813 に答える