Python中的类继承命名

时间:2015-12-13 16:08:41

标签: python python-2.7

有一个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()  

他们扮演两个不同的角色。

2 个答案:

答案 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继承自CBase1的情况被视为Base2继承自CBase1的情况继承自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)

您无法从类外部控制它作为类的客户端,只能通过调用MainClasssuper内的Account内的类中控制它从一个或另一个基类调用方法:Userclass 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;
}