好的。所以我看到有人在用这个代码,我明白了,所以我要用它。
是否必须有__init__
?
class A(object):
def __init__(self):
self.x = 'Hello'
def method_a(self, foo):
print self.x + ' ' + foo
a = A()
a.method_a('Sailor!')
难道我不能做这样的事情吗:
class A(object):
def method_a(self):
print "Hello, Sailor!"
a = A()
print a.method_a()
当我这样做时,我确实得到了“你好,水手!”但我在它下面得到一个“无”?这与 __init__
有关系吗?有人解释。
你问的与 __init__
没有太大关系。您可以按照您在第二个示例中所说的进行操作,但它与第一个示例的功能不同。
在第一个示例中,它打印“Hello”,然后是您传递给该方法的参数。您可以通过传入其他内容来使其打印除“水手”之外的内容:
>>> a.method_a('buddy!')
Hello buddy!
在第二个例子中,它总是打印“Hello, Sailor!”你不能让它打印任何其他东西。
至于 __init__
,在您的示例中,__init__
没有那么有用,因为它所做的只是设置一个属性 x
,即每个对象的相同字符串。如果你想在创建每个对象时“设置”它,你应该使用 __init__
。在您的示例中,此设置并不那么有趣,因为它对每个对象始终相同。您必须使用__init__
,但创建没有附加某种单独状态的对象通常没有多大意义。这是一个更具说明性的示例:
class Greeter(object):
def __init__(self, greeting):
self.greeting = greeting
def greet(self, who):
print self.greeting + ", " + who + "!"
然后你可以这样做:
>>> hello = Greeter("hello")
>>> hello.greet('sailor')
hello, sailor!
>>> howdy = Greeter('Howdy')
>>> howdy.greet('partner')
Howdy, partner!
在这里,当您创建一个Greeter
时,您指定了问候语。该问候语与对象一起存储,并在它问候
某人时使用。 __init__
的要点是您可以使用不同的问候语创建多个问候语。
请注意,当我调用 greet
时,我仍然传递 person to greet。所以问候语(本例中的 hello 或 howdy)是在我创建对象时设置的,但每次我使用该对象问候
时都会重新指定要问候的人。
通常你会在你的代码中混合这两种东西。有些信息是“对象的一部分”,您将在 __init__
中处理它们并将它们存储在对象上。其他的是更具体或暂时的信息,您将作为您要执行的每个任务的函数参数传入。这些之间的平衡取决于类应该做什么,但上面的例子应该说明了区别。
此外,这些都与您看到打印“None”的原因无关。 jimbob 博士解释了为什么会这样。