是否可以通过更改类型来使变量成为类的对象?

时间:2014-10-03 14:06:08

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

假设我们定义了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'>
>>> 

如上所述,obj1var1的值相等,但类型不同。再次,如您所知,我们可以使用str()函数将对象的类型更改为字符串,如下所示:

>>> Obj=str(Obj)
>>> Obj
'<__main__.test object at 0x00000000031B2390>'
>>> 

现在,我想知道是否有任何方法可以反转上述功能?我的意思是,有没有办法将字符串型变量作为对象?

我的意思是有没有办法让Var1等于Obj

换句话说,假设我知道<__main__.test object at 0x00000000031B2390>是一个类对象的值。但我既不知道对象的名称,也不知道类的名称。现在我想创建该类的另一个对象。有什么办法吗?

2 个答案:

答案 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; 应该是什么? foobar?两者的某种组合?