【问题标题】:Is __init__ always required?__init__ 是否总是必需的?
【发布时间】:2014-03-24 04:43:56
【问题描述】:

好的。所以我看到有人在使用这个代码,我理解它,所以我将使用它。 有必要有__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__ 有关吗?有人解释一下。

【问题讨论】:

  • None 与类/初始化问题无关,只是因为您的method_a() 没有返回值。希望这能在一定程度上减少混乱。
  • 如果你忽略它,你的类的__init__ 就是继承自object 的那个(它什么都不做)。没关系。
  • 从print a.method_a() 中省略print,而None 你将不再拥有。

标签: python class init self


【解决方案1】:

您所问的与__init__ 没有太大关系。你可以按照你在第二个例子中所说的去做,但它不会做和第一个例子一样的事情。

在第一个示例中,它打印“Hello”,然后是您传递给方法的参数。您可以通过传递其他内容使其打印除“sailor”之外的其他内容:

>>> 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 时,您指定了问候语。该问候与对象一起存储,并在greets 某人时使用。 __init__ 的意义在于,您可以使用不同的问候语制作多个问候语。

请注意,当我拨打greet 时,我仍然会通过人来打招呼。所以问候语(本例中为你好或你好)是在我创建对象时设置的,但每次我使用greet 对象时都会重新指定要问候的人。

通常你会在你的代码中混合这两种东西。有些信息是“对象的一部分”,您将在__init__ 中处理它们并将它们存储在对象上。其他是更具体或暂时的信息,您将作为您想要执行的每个任务的函数参数传入。这些之间的平衡取决于该类应该做什么,但上面的示例应该说明了差异。

此外,这些都与您看到“无”打印的原因有任何关系。 dr_jimbob 解释了为什么会发生这种情况。

【讨论】:

    【解决方案2】:

    如果您在创建对象时不需要设置任何属性或对对象进行任何其他初始化,则可以放心地省略__init__。你得到None 的原因是你的method_a() 没有返回类型。所以当你打印它时,你会得到None。

    如果你有:

    class A(object):
        def method_a(self):
            return "Hello, Sailor!"
    a = A()
    print a.method_a()
    

    你不会看到None(因为method_a返回一个字符串)然后你在字符串上调用print来显示它。

    或者如果你有:

    class A(object):
        def method_a(self):
            print "Hello, Sailor!"
    a = A()
    a.method_a()
    

    这次调用 method_a 会打印字符串,但由于您没有打印此结果(只是调用它),因此您看不到 None 显示。

    【讨论】:

      猜你喜欢
      • 2021-11-10
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 2015-07-09
      • 2018-02-28
      相关资源
      最近更新 更多