web-dev-qa-db-ja.com

Pythonで継承されたクラスから親クラス属性を設定および取得する方法は?

Familyとその継承されたPersonクラスがあります。 familyNameクラスからPerson属性を取得するにはどうすればよいですか?

class Family(object):
    def __init__(self, familyName):
        self.familyName = familyName

class Person(Family):
    def __init__(self, personName):
        self.personName = personName

たとえば、これらのFamilyおよびPersonオブジェクトを考えます。

strauss = Family('Strauss')
johaness = Person('Johaness')
richard = Person('Richard')

私は次のようなことをしたいと思います:

print richard.familyName

そして'Strauss'。これどうやってするの?

21
msampaio

できません。

インスタンスは親クラスのメソッドと属性のみを継承し、インスタンス属性は継承しません。 2つを混同しないでください。

strauss.familyNameFamilyインスタンスのinstance属性です。 PersonインスタンスはownfamilyName属性のコピーを持ちます。

通常、2つの引数を取るようにPersonコンストラクターをコーディングします。

class Person(Family):
    def __init__(self, personName, familyName):
        super(Person, self).__init__(familyName)
        self.personName = personName

johaness = Person('Johaness', 'Strauss')
richard = Person('Richard', 'Strauss')

別の方法は、PersonFamilyインスタンスへの参照を保持することです。

class Person(object):
    def __init__(self, personName, family):
        self.personName = personName
        self.family = family

ここで、PersonFamilyから継承しなくなりました。次のように使用します。

strauss = Family('Strauss')
johaness = Person('Johaness', strauss)
richard = Person('Richard', strauss)

print johaness.family.familyName
30
Martijn Pieters

Martijnsの提案に加えて、FamilyインスタンスからPersonを作成することもできます。これにより、家族がメンバーを追跡できるようになります。

class Person(object):
    def __init__(self, person_name, family):
        self.person_name = person_name
        self.family = family

    def __str__(self):
        return ' '.join((self.person_name, self.family.family_name))

class Family(object):
    def __init__(self, family_name):
        self.family_name = family_name
        self.members = []

    def add_person(self, person_name):
        person = Person(person_name, self)
        self.members.append(person)
        return person

    def __str__(self):
        return 'The %s family: ' % self.family_name + ', '.join(str(x) for x in self.members)

このような使用法:

>>> strauss = Family('Strauss')
>>> johannes = strauss.add_person('Johannes')
>>> richard = strauss.add_person('Richard')
>>> 
>>> print johannes
Johannes Strauss
>>> print richard
Richard Strauss
>>> print strauss
The Strauss family: Johannes Strauss, Richard Strauss
5
Lennart Regebro