Python:子类

时间:2015-09-06 18:12:41

标签: python oop override

说我有一组这样的课程:

class User(object):

    def __init__(self, profile):
        # ...
        pass

    @classmethod
    def create_user(cls):
        profile = Profile()
        user = cls(profile)

class Profile(object):
    pass

class SpecialUser(User):
    pass

class SpecialProfile(Profile):
    pass

每当我想要子类UserProfile时,我需要对所有这些子类进行子类化,因为使用上面的代码,如果我SpecialUser.create_user()它将是一个特殊的用户,但有一个常规的配置文件。

最简单的解决方法是在User内创建可覆盖的工厂函数,以创建适当的Profile。但是,这可能有点单调乏味。如果用户有个人资料和其他10个课程怎么办?我是否必须为这些中的每一个覆盖工厂功能?如果其他类也互相引用怎么办?所有这些课程都需要工厂职能吗?

我考虑过做这样的事情:

class UserClasses(object):

    class User(object):

        def __init__(self, profile):
            # ...
            pass

        @classmethod
        def create_user(cls):
            profile = cls.__parent__.Profile()
            user = cls(profile)

    class Profile(object):
        pass

class SpecialUserClasses(UserClasses):

    class Profile(UserClasses.Profile):
        pass

将所有这些类包装在另一个类中意味着如果我将外部类子类化并覆盖其中一个内部类,则引用该类的任何其他内部类将自动使用被覆盖的类。问题是,__parent__语法不存在,并且基于我的搜索,内部类没有一种简单的方法来获取它们的外部类。

我如何获得classmethod - 类似功能,但是对于相关类的组?

1 个答案:

答案 0 :(得分:2)

您不一定需要使用可覆盖的功能。你可以拥有一个可覆盖的属性:

class User(object):

    profile_class = Profile

    def __init__(self, profile):
        # ...
        pass

    @classmethod
    def create_user(cls):
        profile = cls.profile_class()
        user = cls(profile)

然后,子类可以定义自己的profile_class属性,它将起作用。但是,要执行此操作,必须在之后定义任何用户类其相应的配置文件类(因为用户类引用了类主体中的配置文件类)。这限制了您可以拥有的交叉引用的复杂性。然而,实际上,一个复杂的相互指称类系统往往令人困惑和脆弱。