2012-08-01 23 views
2

要获得类名的字符串表示,我们可以使用obj.__class__.__name__是否可以重载这些方法,以便我可以返回字符串而不是实际的类名?是否可以重写从对象派生的`__name__`?

+0

'__class__'和'__name__'是类属性(我相信),而不是函数;这些当然是可变的,但是,你真的不应该因为明显的原因修改这些值。你究竟想要完成什么?你是否试图从类实例中返回一些任意的字符串?你可以定义你自己的功能。 – 2012-08-01 23:57:54

回答

5

让我们试试吧! (是的,这个工程):

>>> class Foo(object): 
...  pass 
... 
>>> obj = Foo() 
>>> obj.__class__.__name__ = 'Bar' 
>>> obj 
<__main__.Bar object at 0x7fae8ba3af90> 
>>> obj.__class__ 
<class '__main__.Bar'> 

你也刚刚做Foo.__name__ = 'Bar',我以前obj.__class__.__name__要与你的问题是一致的。

+4

+1为“让我们试试” – jfs 2012-08-01 23:34:49

+0

我宁愿使用'Foo .__ name__ ='Bar'',除非你有任意的对象并且想要改变它的任何类的名字。但改变一些未知类的名称以便对其中一个实例产生影响似乎非常不可靠 – Ben 2012-08-02 03:33:01

4

是的。

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

但是,这似乎是一个坏主意。

+1

所以......每当我们创建一个新的“A”类对象时,我们将这个类重命名为'B'?看起来更清洁(如果你要重命名类)直接重命名类,而不是创建实例的副作用。 – Ben 2012-08-02 03:29:59

+0

只是一个示例实现。 OP可以根据他的要求执行。 – pyrospade 2012-08-02 04:23:28

2

你可以这样做:

>>> class Foo(object): 
...  def __init__(self): 
...    self.__class__.__name__ = "Bar" 
... 
>>> print Foo().__class__.__name__ 
Bar 

或者你可以让自己的双下划线属性。

>>> class Foo(object): 
...  __name__ = "Bar" 
... 
>>> print Foo().__name__ 
Bar 

但你为什么要这么做?我没有看到任何可能的用途。顺便说一句,我知道这不是__class__.__name__相同,但我不认为改变__class__.__name__通常是一个好主意。

+0

第二个版本仅适用于实例--Foo .__ name__'将保持不变。有趣的是,Python3允许以这种方式正确设置'__qualname__'。 – MisterMiyagi 2018-01-24 12:49:04

相关问题