仅在基类(Python)中获取attributeibutes

2024-03-28 14:39:53 发布

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

我的班级结构如下:

class Parent(object):
    def __init__(self, id, name):
        self.id = id
        self.name = name

    def print_vars(self):
        print(vars(self))

class Child(Parent):
    def __init__(self, id, name, last_name, age):
       Parent.__init__(self, id, name)
       self.last_name = last_name
       self.age = age

class AnotherChild(Parent):
    def __init__(self, id, name, address):
       Parent.__init__(self, id, name)
       self.address= address

也许不是最好的例子,但我希望能有足够的机会让大家理解这个想法。我的想法是初始化两个独立的实例,它们共享一些共同的属性和方法。我需要能够将这两个对象转储到一些json和csv文件中,这是我希望通过方法dump_to_file(在本例中被print_vars替换)实现的。现在,当我必须将父类和子类的所有属性都转储到单个文件时,这个方法工作得很好。但是,我只想从父类转储属性。我试图用supersuper(Parent, self)来代替self,但没有成功。只有才能从编写代码的类中访问属性的最佳方法是什么?你知道吗

我相信Java会自动做到这一点,因为方法是在父类中定义的,父类不知道子类属性。你知道吗


Tags: 方法nameselfidage属性initaddress
2条回答

假设您不打算在__init__之外添加更多变量,可以冻结父级的__init__方法中的变量列表:

def __init__(self, id, name):
    self.id = id
    self.name = name
    self.__parent_vars = dict(vars(self))  # make a copy

然后使用这个字典,它只包含初始化父类时定义的变量:

def print_values(self, path):
    print(self.__parent_vars)

测试:

c = Child(12,"Foo","whatever",34)
c.print_vars()

我得到:

{'id': 12, 'name': 'Foo'}

我目前也面临同样的问题,并试图找到解决办法。 @Jean-François Fabre♦的答案不能解决我自己的问题—它在初始化子类时冻结了参数值,如果它将来发生变化,您的子类永远不会知道它。你知道吗

我做了一些修改来修复它:

class Parent(object):
    def __init__(self, id, name):
        self.id = id
        self.name = name
        self.__parent_vars = ['id', 'name']  # make a copy

    def print_values(self):
        res = {}
        for el in self.__parent_vars:
            res[el] = vars(self)[el]
        return res


class Child(Parent):
    def __init__(self, id, name, last_name, age):
        Parent.__init__(self, id, name)
        self.last_name = last_name
        self.age = age

让我们测试一下:

c = Child(12,"Foo","whatever",34)
res1 = c.print_values()
print(res1)

c.id = 24
res2 = c.print_values()
print(res2)

输出:

{'id': 12, 'name': 'Foo'}
{'id': 24, 'name': 'Foo'}

现在它可以像我预期的那样工作,但是我需要为它创建额外的变量。例如,如果我想pickle,我的类也会pickle这个我不需要的额外变量。是否可以在不创建额外变量的情况下执行相同的操作?

相关问题 更多 >