除__init__之外的def中的实例变量赋值?

时间:2014-11-16 14:41:24

标签: python oop

我对Python很陌生,只是想知道而不是:

class human(object):
  def __init__(self):
    self.name = "bobby"

我们可以在另一个def中分配实例变量'name',例如:

def nameBaby(object):
  self.name = "bobby"

3 个答案:

答案 0 :(得分:2)

是的,您可以在任何地方的对象上创建新属性:__init__,类的其他方法,甚至是类外的代码。好的风格决定了你无论如何都要在__init__中定义它们。它使得理解代码变得更容易。

答案 1 :(得分:2)

是的,你可以。

>>> class human(object):
    def __init__(self):
        self.name = "bobby"
    def call_me(self):
        self.name = "my name is bobby"


>>> h = human()
>>> h.name
'bobby'
>>> h.name = "new name"
>>> h.name
'new name'
>>> h.call_me()
>>> h.name
'my name is bobby'

答案 2 :(得分:0)

__init__()中定义它的好处是,您知道在任何其他方法之前都会调用它,因此您可以避免在创建之前尝试访问它的风险。

例如,比较在__init__()中创建成员变量的代码:

#!/usr/bin/env python

class human(object):
    def __init__(self):
        self.name = '<unnamed baby>'

    def nameBaby(self, name):
        self.name = name

    def getName(self):
        return self.name

kid = human()
print kid.getName()
kid.nameBaby('Bruce')
print kid.getName()

输出:

paul@thoth:~/src/sandbox$ ./baby1.py
<unnamed baby>
Bruce
paul@thoth:~/src/sandbox$ 

使用此代码,但不是:

#!/usr/bin/env python

class human(object):
    def __init__(self):
        pass

    def nameBaby(self, name):
        self.name = name

    def getName(self):
        return self.name

kid = human()
print kid.getName()
kid.nameBaby('Bruce')
print kid.getName()

输出:

paul@thoth:~/src/sandbox$ ./baby2.py
Traceback (most recent call last):
  File "./baby2.py", line 14, in <module>
    print kid.getName()
  File "./baby2.py", line 11, in getName
    return self.name
AttributeError: 'human' object has no attribute 'name'
paul@thoth:~/src/sandbox$ 

您通常无法控制用户可以调用您的课程方法的顺序,通常,您不应该要求您的课程依赖于任何此类顺序。在上面显示的情况下,通过在__init__()中创建成员变量,您的代码非常强大,无论用户调用哪种方法,都可以正常运行(尽管它并不能保证您的方法能够保证。当然,实际上会得到任何特别有意义的东西。

相关问题