仅在基类(Python)中获取属性

时间:2017-04-26 11:38:28

标签: python inheritance

我有以下类结构:

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替换)来实现。现在,当我必须将父类和子类的所有属性转储到单个文件时,此方法工作正常。但是,我想只从父类转储属性。我尝试将self替换为supersuper(Parent, self),但没有取得多大成功。访问编写代码的类中的属性的最佳方法是什么?

我相信Java会自动执行此操作,因为该方法是在父类中定义的,而父类不知道子类属性。

2 个答案:

答案 0 :(得分:4)

假设您不打算在__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'}

答案 1 :(得分:0)

我目前正面临着同样的问题,并试图寻找解决方案。 @Jean-François Fabre♦的答案无法解决我自己的问题-它会在初始化Child类时冻结参数值,如果将来发生更改,您的Child类将一无所知。

我进行了一些修改以解决此问题:

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'}

现在它可以正常工作了,但是我需要为其创建additioanl变量。因此,例如,如果我想腌制我的课,它也会腌制我不需要的其他变量。 是否可以在不创建其他变量的情况下执行相同的操作?