【问题标题】:Differences in these subclass definitions?这些子类定义的差异?
【发布时间】:2017-03-29 10:03:11
【问题描述】:

有人可以解释以下从BaseClass 派生的类定义之间的区别以及在什么情况下如何定义它们很重要:

class BaseClass(object):
    def __init__(self):
        # ...

    def as_dict(self):
        # ...


class SomeClass(BaseClass):

    def as_dict(self):
        # Does this somehow change the method compared to 'AnotherClass.as_dict()' below
        return super(SomeClass, self).as_dict()


class AnotherClass(BaseClass): pass

SomeOtherClass = BaseClass

【问题讨论】:

    标签: python python-2.7 python-3.x class


    【解决方案1】:

    由于您将SomeClass 方法添加到包含单个 super 调用的as_dict 方法,因此该类的最终行为没有区别。不同之处在于,总体而言,您添加了几个不必要的函数调用。

    AnotherClass 的行为与SomeClass 一样,因为SomeClassas_dict 中没有任何不同。它照常继承BaseClass的方法。

    SomeOtherClass 只是BaseClass另一个名称,您并没有在那里创建子类关系,只是附加了另一个名称,您可以通过该名称引用该类。

    【讨论】:

    • 谢谢,如果派生类没有添加任何新内容,推荐的方法是什么? AnotherClassSomeOtherClass?
    【解决方案2】:

    这是使用了不同名称的BaseClass

    class AnotherClass(BaseClass): pass
    

    这是使用BaseClass,但修改了方法“as_dict”。as_dict方法中,你可以做任何事情(即修改发送给这个方法的参数)然后运行as_dict方法的常用功能与super(SomeClass, self).as_dict()

    class SomeClass(BaseClass):
        def as_dict(self):
            # Does this somehow change the method compared to 'AnotherClass.as_dict()' below
            return super(SomeClass, self).as_dict()
    

    这只是将BaseClass 分配给SomeOtherClass,这意味着他们可以通过两个关键字使用BaseClass

    SomeOtherClass = BaseClass
    

    【讨论】:

    • "这是使用不同名称的 BaseClass" 但事实并非如此; AnotherClassBaseClass 的子类,SomeOtherClassBaseClass 的另一个名称。
    猜你喜欢
    • 2016-05-17
    • 2015-06-29
    • 1970-01-01
    • 2011-05-16
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多