有一个BaseClient
class BaseClient(object):
后来在很多类中获得继承
class Account(BaseClient):
def create(self, **params):
pass
和其他几个人。
class MainClass(Account, User):
pass
有一些函数使用相同的创建函数
def create(self, **params):
pass
如何添加像
这样的唯一类标签MainClass.Account.create()
现在它正在运作
MainClass.create()
更新:
有很多重复的函数,比如create(),它们会覆盖那些正在进行的函数。我想把这个班叫做帐户,所以当我打电话
MainClass.Account.create()
MainClass.User.create()
他们扮演两个不同的角色。
答案 0 :(得分:1)
换句话说,您有多重继承,其中包含:
value
在班级class Base1(object):
def create(self): ...
class Base2(object):
def create(self): ...
class C(Base1, Base2):
def create(self): ...
中,您可以选择是否从父类调用实现。
选项1:未在班级C
中实施create
如果您未在C
中实施方法create
,则会使用C
。
请注意,Base1.create
继承自C
和Base1
的情况被视为Base2
继承自C
和Base1
的情况继承自Base1
。
如果你Base2
另见关于MRO的帖子:Method Resolution Order (MRO) in new style Python classes
选项2:不要调用基本实现
print C.__mro__
现在不再调用class C(Base1, Base2):
def create(self):
pass
。
选项3:只调用其中一个基础
Base1.create
现在不会调用class C(Base1, Base2):
def create(self):
Base2.create(self)
,但Base1.create
是。
选项4:调用每个基本实现
Base2.create
将调用class C(Base1, Base2):
def create(self):
Base1.create(self)
Base2.create(self)
和Base1.create
。
选项5:用户Base2.create
来调用所有基本实现
虽然选项4在这里似乎是一个非常好的解决方案,但在某些配置中,如钻石继承,它可能会导致多次调用方法。因此,另一种方法是用户super
,它使用MRO(参见选项1)来确定要使用的基本实现。通过使用MRO,它避免了钻石继承问题。但是,它必须在所有类别上系统地使用,即使它有它的警告。
super
此处,class CommonBase(object):
def create(self):
pass
class Base1(CommonBase):
def create(self):
super(Base1, self).create()
class Base2(CommonBase):
def create(self):
super(Base2, self).create()
class C(Base1, Base2):
def create(self):
super(C, self).create()
会调用所有四种C().create()
方法,每次一次。
答案 1 :(得分:0)
您无法从类外部控制它作为类的客户端,只能通过调用MainClass
在super
内的Account
内的类中控制它从一个或另一个基类调用方法:User
或class MainClass(Account, User):
# your own convention that by default it calls Account.create
def create(self, **params):
super(Account, self).create(**params)
def create2(self, **params):
super(User, self).create(**params)
。
#include <iostream>
#include <sys/wait.h>
#include <unistd.h>
using namespace std;
int main() {
string filename_memory;
decltype(fork()) pid;
if (!(pid = fork())) {
cout << "in child" << endl;
sleep(1);
}
else {
int status_child;
do {
waitpid(pid, &status_child, WNOHANG);
cout << "waiting for child to finish" << endl;
} while (!WIFEXITED(status_child));
cout << "child finished" << endl;
}
return 0;
}