Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 使用类实例而不是类的类继承_Python 3.x_Class_Oop_Inheritance - Fatal编程技术网

Python 3.x 使用类实例而不是类的类继承

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

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