使用父 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
可以拥有自己的属性(方法或变量),您可以在所包含实例的 所有 属性之上访问这些属性。
假设我们有 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
可以拥有自己的属性(方法或变量),您可以在所包含实例的 所有 属性之上访问这些属性。