在Python中创建等效类?

Ber*_*olt 3 python

我在Python中使用重载或屏蔽类.以下代码示例是否创建了等效的类?

class CustASample(object):
    def __init__(self):
        self.__class__.__name__ = "Sample"

    def doSomething(self):
        dummy = 1
Run Code Online (Sandbox Code Playgroud)

class Sample(object):
    def doSomething(self):
        dummy = 1
Run Code Online (Sandbox Code Playgroud)

编辑:从评论和gs的好答案,它发生在我身上,我真的想问:什么"属性"使这些类不同?

因为

>>> dir(a) == dir(b)
True
Run Code Online (Sandbox Code Playgroud)

>>> print Sample
<class '__main__.Sample'>
>>> print CustASample
<class '__main__.Sample'>
Run Code Online (Sandbox Code Playgroud)

>>> Sample == CustASample
False
Run Code Online (Sandbox Code Playgroud)

Geo*_*lly 10

不,他们仍然不同.

a = CustASample()
b = Sample()
a.__class__ is b.__class__
-> False
Run Code Online (Sandbox Code Playgroud)

这是你如何做到的:

class A(object):
    def __init__(self):
        self.__class__ = B

class B(object):
    def bark(self):
       print "Wuff!"

a = A()
b = B()
a.__class__ is b.__class__
-> True

a.bark()
-> Wuff!

b.bark()
-> Wuff!
Run Code Online (Sandbox Code Playgroud)

通常你会在__new__方法中而不是在__init__:

class C(object):
    def __new__(cls):
        return A()
Run Code Online (Sandbox Code Playgroud)

要回答您更新的问题:

>>> a = object()
>>> b = object()
>>> a == b
False
Run Code Online (Sandbox Code Playgroud)

为什么一个不等于b,因为两者都只是不带属性平原对象?

嗯,答案很简单.如果==运算符__eq__可用,则调用它.但除非你自己定义,否则不是.而不是它a is b被使用.

is比较对象的ID.(在CPython中的内存地址.)你可以得到一个像这样的对象的id:

>>> id(a)
156808
Run Code Online (Sandbox Code Playgroud)