假设我们定义了test()
类,如下所示:
>>> class test():
pass
通常,当我运行以下代码时,我将Obj
作为test()
类的对象:
>>> obj=test()
>>>
>>> obj
<__main__.test object at 0x00000000031B2390>
>>> type(obj)
<class '__main__.test'>
>>>
如上所述obj
有两个功能。它有一个值和一个类型。
在下面,我将Obj
值作为字符串分配给另一个名为var1
的变量:
>>> var1='<__main__.test object at 0x00000000031B2390>'
>>>
>>> type(var1)
<class 'str'>
>>>
如上所述,obj1
和var1
的值相等,但类型不同。再次,如您所知,我们可以使用str()
函数将对象的类型更改为字符串,如下所示:
>>> Obj=str(Obj)
>>> Obj
'<__main__.test object at 0x00000000031B2390>'
>>>
现在,我想知道是否有任何方法可以反转上述功能?我的意思是,有没有办法将字符串型变量作为对象?
我的意思是有没有办法让Var1
等于Obj
?
换句话说,假设我知道<__main__.test object at 0x00000000031B2390>
是一个类对象的值。但我既不知道对象的名称,也不知道类的名称。现在我想创建该类的另一个对象。有什么办法吗?
答案 0 :(得分:1)
这里有一些误解。
首先,说变量有两个东西,一个值和一个类型是不正确的。它只有一件事:价值。该值有一个类型。 Python中的变量没有类型,它们只是指向事物的名称。
其次,分配一个看起来像对象的repr的字符串不会以某种方式使值等于该对象。字符串只是一个字符串。
答案 1 :(得分:1)
您将对象(obj.__repr__()
或repr(obj)
)的表示与其值混淆(不一定对所有类型的对象都有明智的意义*)。以下是具有误导性表示的对象示例:
>>> a = 1
>>> a
1
>>> class FakeInt(object):
def __repr__(self):
return "1"
>>> b = FakeInt()
>>> b
1
>>> a == b
False
>>> a + b
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
a + b
TypeError: unsupported operand type(s) for +: 'int' and 'FakeInt'
a
看起来像 b
,但不等于它,不能以相同的方式使用。
实现__repr__
和__eq__
实例方法是常规的eval(repr(obj)) == obj
。这允许您创建与现有对象相同的新对象,例如:
>>> class SillyString(object):
def __init__(self, s):
self.string = s
def __repr__(self):
return "SillyString({0.string!r})".format(self)
def __eq__(self, other):
return self.string == other.string
>>> s = SillyString("foo")
>>> repr(s)
"SillyString('foo')"
>>> eval(repr(s)) == s
True # equal to s
>>> eval(repr(s)) is s
False # but not identical to s, i.e. a separate object
然而,对于test
个对象来说,这似乎毫无意义,因为它们无论如何都没有要复制的属性或方法。
*例如,这是一个对象定义:
def some_obj(object):
def __init__(self, foo, bar):
self.foo = foo
self.bar = bar
它的&#34;值&#34; 应该是什么? foo
? bar
?两者的某种组合?