动态修改实例的属性

时间:2014-09-20 04:53:19

标签: python oop python-3.4

我的问题已经解决,但我想知道原因。

我的情况如下:

我将类Vector定义为:

class Vector:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

创建了以下实例:

v1 = Vector(1,1)

以下代码为什么不起作用

def plus_one_A(thing):
    attrs = vars(thing)
    for attr_name, value in attrs.items():
        if type(value) == int or type(value) == float:                
            eval('thing.'+ attr_name + ' += 1')
    return thing

v2 = plus_one_A(v1)

thing.x += 1 
         ^
SyntaxError: invalid syntax

但以下情况呢?

def plus_one_B(thing):
    attrs = vars(thing)
    for attr_name, value in attrs.items():
        if type(value) == int or type(value) == float:                
            setattr(thing, attr_name, value + 1)
    return thing

v2 = plus_one_B(v1)

难道这些代码不相同吗?

1 个答案:

答案 0 :(得分:1)

您需要使用exec代替evaleval只能用于expression,而不能用于statement

>>> eval('1 + 2')
3
>>> eval('x = 1 + 2')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    x = 1 + 2
      ^
SyntaxError: invalid syntax
>>>
>>> exec('x = 1 + 2')
>>> x
3

BTW,isinstance不仅接受一个类型对象,还接受第二个参数的类型元组。

>>> isinstance(1, (int, float))
True
>>> isinstance(1.0, (int, float))
True
>>> isinstance('1', (int, float))
False