python - __init__ 总是需要的吗?

标签 python class init self

<分区>

好的。所以我看到有人在用这个代码,我明白了,所以我要用它。 是否必须有__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 博士解释了为什么会这样。

关于python - __init__ 总是需要的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22601253/

相关文章:

python - 具有历史记录的唯一观看次数

java - 在 Java 中创建动态给定类的实例

swift - 在字典中存储和访问对象数组 - Swift 3 - macOS

linux - 系统重启/关机时未运行初始化脚本

autossh 的 Bash 初始化脚本

Python - Tkinter - 有趣的 place()

python - pytest:以 DRY 方式参数化装置

python - Pytorch:如何通过python字典中的张量(键)访问张量(值)

php - 什么 php 版本允许这样做?

python - django、uni_form 和 python 的 __init__() 函数 - 如何将参数传递给表单?