我正在写一些代码,它是继承的倒三角形。我有一个基本的Linux类,它有一个客户端attr,它保存一个连接。我有几个逻辑上分离的api(kvm、yum、gdb、dhcp等等),它们使用CLIENT,但是我只希望用户需要创建一个Linux类的实例,但是能够调用父类中的所有方法。在保持父级之间良好的逻辑代码分离的同时:
class Linux(
SSHClient,
yum.Yum,
kvm.Kvm,
ldap.Ldap,
lshw.Lshw,
packet_capture.Tcpdump,
tc.TrafficControl,
networking.Networking,
gdb.Gdb,
dhcp.Dhcp,
httputil.Http,
scp.Scp,
fileutils.FileUtils):
我举了个小例子:
class Dad(object):
def __init__(self):
raise NotImplementedError("Create Baby instead")
def dadCallBaby(self):
print('sup {}'.format(self.babyName))
class Mom(object):
def __init__(self):
raise NotImplementedError("Create Baby instead")
def momCallBaby(self):
print('goochi goo {}'.format(self.babyName))
class Baby(Mom, Dad):
def __init__(self, name):
self.babyName = name
def greeting(self):
self.momCallBaby()
self.dadCallBaby()
x=Baby('Joe')
x.greeting()
这叫什么?这只鸭子在打字吗?还有更好的选择吗?你知道吗
真的不存在“只有孩子的属性”。你知道吗
属性
babyName
只是存储在每个对象的名称空间中,并在那里查找。Python并不关心它是由Baby.__init__
存储的。事实上,您可以在Mom
上写入并存储不是Baby
的相同属性,其工作方式相同:而且,很难提出一个更好的方法来做你正在做的事情,因为你正在做的事情本身就是令人困惑的,可能不应该做。你知道吗
继承通常意味着子类型化,也就是说,如果每个
Baby
实例都可用作Mom
,那么Baby
只能是Mom
的子类但是婴儿不是妈妈和爸爸。2婴儿有妈妈和爸爸。表示这一点的方法是为它的父母提供
Baby
属性:注意,例如,这意味着同一个女人可以是两个孩子的妈妈。既然你在这里建模的真实事物也是如此,那就表明你在正确地建模。你知道吗
你的“真实”例子有点不太清楚,但我怀疑那里也发生了同样的事情。你知道吗
据我所知,您想要使用继承的唯一原因是:
你不需要,也不想继承:
如果
yum.Yum
、ldap.Ldap
和dhcp.Dhcp
都有名为lookup
的方法,那么Linux.lookup
会调用哪个方法?你知道吗您可能希望将这些属性保留为公共属性,并显式地使用它们:
或者您需要提供一个“Linux API”,它封装了所有底层API:
如果您真的想转发所有不同组件的每个方法,并且您确定它们之间没有冲突,并且有太多的方法需要手动编写,那么您可以通过编程的方式来完成,通过迭代所有的类,迭代每个类的
inspect.getmembers
,筛选出以_
开头或不是未绑定方法的方法,创建一个代理函数,并将其setattr
放到Linux
。你知道吗或者,您也可以在方法查找时通过实现
__getattr__
方法(通常还有__dir__
方法)来动态代理(在本例中可能不是一个好主意,但在没有太大区别的情况下非常有用)。你知道吗我想这两种代理中的一种可能就是你真正想要的。你知道吗
1。在某些情况下,您希望继承的原因不是子类型。例如,您继承一个mixin类来获取一组方法的实现。类是否在mixin实例可用的任何地方都可用的问题实际上没有意义,因为mixin在任何地方都不可用(除了作为基类)。但是,子类型仍然是您正在弯曲的标准。
2。如果是,请致电儿童保护服务中心。同时打电话给X教授,因为这在物理上是不可能的。
相关问题 更多 >
编程相关推荐