Python 3.x 使用类实例而不是类的类继承
在Python3中,从类实例继承属性的正确方法是什么 例如,如何从Python 3.x 使用类实例而不是类的类继承,python-3.x,class,oop,inheritance,Python 3.x,Class,Oop,Inheritance,在Python3中,从类实例继承属性的正确方法是什么 例如,如何从族类的实例继承属性,例如lastname: class Family: def __init__(self, last): self.lastname = last class Person(Family): def __init__(self, first): self.firstname = first # The below code does not work an is
族
类的实例继承属性,例如lastname
:
class Family:
def __init__(self, last):
self.lastname = last
class Person(Family):
def __init__(self, first):
self.firstname = first
# The below code does not work an is an example of the desired usage:
family = Family('Smith')
person = Person('David', family)
>>> person.firstname
'David'
>>> person.lastname
'Smith'
目标是让person
从family
类的family
实例继承属性,例如lastname
:
class Family:
def __init__(self, last):
self.lastname = last
class Person(Family):
def __init__(self, first):
self.firstname = first
# The below code does not work an is an example of the desired usage:
family = Family('Smith')
person = Person('David', family)
>>> person.firstname
'David'
>>> person.lastname
'Smith'
我想你需要这样的东西:
class Family:
def __init__(self, last):
self.lastname = last
class Person(Family):
def __init__(self, first, family):
self.firstname = first
if isinstance(family, Family):
family = family.lastname
self.lastname = family
family = Family('Smith')
person = Person('David', family)
或者可能:
class Person(Family):
def __init__(self, first, family):
self.firstname = first
if isinstance(family, Family):
family = family.lastname
super().__init__(family)
我看到两个选项:为person类实现
def lastname(self)
,并将实现推迟到存储的族
或者,您可以在person上实现
\uuu getattr\uuu
,并将所有内容转发给家庭。不过,我还不确定这种方法,它似乎太类似于常规继承。例如,如果一个家庭有一个方法成员数(自我)
,每个人也会有。如果可以的话,常规继承也同样有效 您不会继承这些属性,您需要对它们进行初始化。有没有一种方法可以从家族
继承而不指定self.family=family.lastname
?如果这个家族有100个需要继承的属性呢?有没有一种方法可以直接继承它们而不显式地分配它们?我不知道,没有一些技巧。让我们看看其他人有什么想法。如果有很多属性,一种方法是将属性列表保持为列表,并使用**kwargs
初始化类。但这仍然需要显式代码来从一个实例初始化另一个实例。另一个想法是:您可以在要复制到Person
的家族
的每个方法上使用装饰程序。然后在Person.\uuuu init\uuuu
中为所有方法分配正确的修饰符。或者只需在\uuuu getattr\uuuu
中检查decorator。常规继承可以在类上工作,但不能在类实例上工作,不是吗?我不介意家族的方法是否被继承,需要的是实例的属性。另一个答案建议手动分配属性。不过,有几十个属性需要继承。有没有一种方法可以从类实例继承属性而不显式地分配它们?或者我做错了,应该把人
实例添加到家族
类实例中吗?@dave:你是对的,所以你想要的是代理方法调用。请看一下\uuu getattr\uuuu
。您应该能够编写以下内容:def\uu getattr\uu(self,name):return getattr(self.family,name)