我对Python很陌生,只是想知道而不是:
class human(object):
def __init__(self):
self.name = "bobby"
我们可以在另一个def中分配实例变量'name',例如:
def nameBaby(object):
self.name = "bobby"
答案 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__()
中创建成员变量,您的代码非常强大,无论用户调用哪种方法,都可以正常运行(尽管它并不能保证您的方法能够保证。当然,实际上会得到任何特别有意义的东西。