我在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)
| 归档时间: |
|
| 查看次数: |
215 次 |
| 最近记录: |