我有以下类结构:
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
替换为super
或super(Parent, self)
,但没有取得多大成功。访问仅编写代码的类中的属性的最佳方法是什么?
我相信Java会自动执行此操作,因为该方法是在父类中定义的,而父类不知道子类属性。
答案 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变量。因此,例如,如果我想腌制我的课,它也会腌制我不需要的其他变量。 是否可以在不创建其他变量的情况下执行相同的操作?