1

是否可以直接访问方法的属性?我试过了,但失败了:

class Test1:
    def show_text(self):
        self.my_text = 'hello'

结果是:

>>> t = Test1()
>>> t.my_text
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: Test1 instance has no attribute 'my_text'

我发现使用它可以使它起作用:

class Test1:
    def __init__(self):
        self.my_text = 'hello'

但我想知道是否仍然可以直接访问方法的属性?还是我在做一些非常糟糕的事情?

4

3 回答 3

4

实例变量是在对象被实例化后创建的,并且只有在它们被分配之后才会创建。

class Example(object):
      def doSomething(self):
          self.othervariable = 'instance variable'

>> foo = Example()
>> foo.othervariable
AttributeError: 'Example' object has no attribute 'othervariable'

由于othervariable是在内部分配的doSomething——我们还没有调用它——所以它不存在。

但是,一旦我们调用它:

>> foo.doSomething()
>> foo.othervariable
'instance variable'

__init__是一种特殊方法,只要发生类实例化就会自动调用。这就是为什么当您在其中分配变量时,在创建新实例后可以立即访问它。

class Example(object):

      def __init__(self):
          self.othervariable = 'instance variable'

>> foo = Example()
>> foo.othervariable
'instance variable'
于 2013-05-23T14:47:13.100 回答
2

my_text属性不存在,直到您不调用show_text

>>> class Test1:
...         def show_text(self):
...                 self.my_text = 'hello'
...         
>>> t  = Test1()
>>> t.show_text()
>>> t.my_text
'hello'

如果您希望在实例创建期间创建属性,请将它们放在__init__方法中。

于 2013-05-23T14:38:53.790 回答
2

您的第一个示例不起作用:由于您从不使用show_text()方法,因此您的对象将永远不会具有属性my_text(仅在您调用该方法时才会“添加”到您的对象中)。

第二个例子很好,因为__init__方法会在你的对象被实例化后立即执行。

此外,通过对象本身的 getter 方法访问对象属性是一种很好的做法,因此修改代码的最佳方法是

class Test1:
    def __init__(self,value):
        self.my_text = value
    def show_text(self):
        return self.my_text

然后以这种方式使用

t = Test1('hello')
t.show_text()

最后,有这样的方法也很好

def set_text(self,new_text):
    self.my_text = new_text
于 2013-05-23T14:39:29.837 回答