使用父 class 实例创建子 class 对象

Create child class object using parent class instance

假设我们有 class A,它有一个实例 - x。如何创建 class 的子 class A,我可以在其中将 x 作为参数传递并获取其所有参数并将其传递给子 class 对象。准确地说我想做这样的事情。

class A:
    def __init__(self, parameter1, parameter2):
        self.parameter1 = parameter1
        self.parameter2 = parameter2




class B(A):
    def __init__(self, Ainstance, someParameter):
        super().__init__(**Ainstance.__dict__)
        self.someParameter = someParameter

x = A(parameter1='1', parameter2='2')

x = B(x, someParameter='3')

print(x.parameter1)
print(x.parameter2)
print(x.someParameter)

目标是创建一个 class,我可以在其中获取父 class 对象的所有参数,并添加我自己的属性。上面代码中的问题是我无法对所有 classes 执行此操作,因为并非所有这些都具有 __dict__ 属性。

您可以像这样使用 dir 和 getattr 而不是 dict

class A:
    def __init__(self, parameter1, parameter2):
        self.parameter1 = parameter1
        self.parameter2 = parameter2


 class B(A):
     def __init__(self, Ainstance, someParameter):
        parameters = {param: getattr(Ainstance, param) for param in dir(Ainstance) if not param.startswith("__")} 
        super().__init__(**parameters)
        self.someParameter = someParameter

更详细的解释见:Get all object attributes in Python?

我有这个示例代码,我用它来提醒自己如何构建 proxy

#soProxyPattern

class Example:
    def __init__(self):
        self.tag_name = 'name'
    def foo(self):
        return 'foo'
    def bar(self, param):
        return param
    
class Container:
    def __init__(self, contained):
        self.contained = contained
        self.user_name = 'username'

    def zoo(self):
        return 0
    
    def __getattr__(self, item):
        if hasattr(self.contained, item):
            return getattr(self.contained,item)
        #raise item

c = Container(Example())
print(c.zoo())
print(c.foo())
print(c.bar('BAR'))
print(c.tag_name)
print(c.user_name)

输出为:

0
foo
BAR
name
username

这表明 Container 可以拥有自己的属性(方法或变量),您可以在所包含实例的 所有 属性之上访问这些属性。