Python 使用_getattr_________________________________?

Python 使用_getattr_________________________________?,python,q,object-composition,Python,Q,Object Composition,首先,请接受我的道歉,如果这是一个重复-我有感觉,我已经看到了类似的讨论之前排序,但我真的找不到它 我的问题是Python中的对象组合,它应该看起来像是复合类中每个次要类的继承。用例是多个对象实例共享一个共同的属性核心及其值(而不仅仅是一个共同的结构,这将是一个经典的继承案例) 我可以用一个简单的属性来实现这一点,也就是说,让每个类都有一个名为“shared_attributes”的属性,该属性本身就是一个存储所有值的类: class核心类(对象): 定义初始化(自): self.attr='a

首先,请接受我的道歉,如果这是一个重复-我有感觉,我已经看到了类似的讨论之前排序,但我真的找不到它

我的问题是Python中的对象组合,它应该看起来像是复合类中每个次要类的继承。用例是多个对象实例共享一个共同的属性核心及其值(而不仅仅是一个共同的结构,这将是一个经典的继承案例)

我可以用一个简单的属性来实现这一点,也就是说,让每个类都有一个名为“shared_attributes”的属性,该属性本身就是一个存储所有值的类:

class核心类(对象):
定义初始化(自):
self.attr='asdf'
类CompClass1(对象):
def _u初始(自身,核心):
self.core\u attr=core
类CompClass2(对象):
def _u初始(自身,核心):
self.core\u attr=core
但这需要我通过
class.core\u attr
属性访问每个共享属性,我不希望这样做(有几个原因,其中之一是这需要大量重写代码)

因此,我想使用一个复合模式,该模式依赖于Python内置的
\uuu getattr\uuu
对象方法,如下所示:

类TestClass1(对象):
定义初始化(自):
self.attr1=1
定义函数a(自身):
返回“a”
类CompClassBase(对象):
定义初始化(自测试类):
self.comp\u obj=测试类
def _uGetAttr _;(自身,项目):
返回getattr(self.comp_obj,项目)
类CompClass1(CompClassBase):
定义初始化(自测试类):
CompClassBase.\uuuuu init\uuuuuu(自测试类)
self.attr2=13
定义函数b(自身):
返回“1b”
类别CompClass2(CompClassBase):
定义初始化(自测试类):
CompClassBase.\uuuuu init\uuuuuu(自测试类)
self.attr2=23
定义函数b(自身):
返回'2b'
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
tc=TestClass1()
cc1=组件类别1(测试类=tc)
cc2=组件类别2(测试类别=tc)
打印cc1.1
打印cc1.2
打印cc1.func_a()
打印cc1.func_b()
打印cc2.1
打印cc2.2
打印cc2.func_a()
打印cc2.func_b()
它应该打印以下内容:

1
13
A.
1b
1.
23
A.
2b
这种模式非常适合我的需要,但它有一些东西想让我确信它

编辑:(对某些注释作出响应)此模式必须共享共享类中的所有属性(给定前面的对象):

cc1.attr1='这是一个测试'
cc2.attr1#现在也必须是“这是一个测试”!
第二次编辑:我已经使用这个模式好几个星期了,效果很好。但是,我仍然希望进行一些讨论,因为我希望从现在起将此模式包括在我的标准工具包中:-)


所以现在我的问题很简单:这是一个好的实践吗?这种特定的Python模式有什么缺点吗?我应该注意这里的一些危险吗?

似乎在类中使用mix要简单得多。为什么不直接使用继承呢?另外,是否有理由使用
self.comp\u obj.\uuuu getattribute\uuuu(item)
而不是
getattr(self.comp\u obj,item)
?哦,我明白了。
TestClass1
的共享实例的更新应该对任何使用它的实例都可见。@mgilson很好,这是:-)我更新了问题以使用getattr。谢谢切普纳的评论回答了继承的问题。(我甚至可能想将共享实例设置为单例…@mgilson:大多数情况下,组合比继承更好。