【问题标题】:Python Class __init__ ConfirmationPython 类 __init__ 确认
【发布时间】:2015-03-28 13:18:57
【问题描述】:

我试图理解 Python 类。我对定义__init__ 有点困惑。如果我创建了 4 个函数,它们都采用各种输入变量。我必须在__init__ 中分配每个变量吗?

 class Thing:
     def __init__(self, arguments, name, address, phone_number, other):
         self.arguments = arguments
         self.name = name
         self.address = address
         self.phone_number = phone_number
         self.other = other

     def First(self, name):
         print self.name

     def Arguments(self, arguments):
         print self.arguments

     def Address(self, address, phone_number):
         print self.address + str(self.phone_number)

     def Other(self, other):
         print self.other

以上内容完全是编造的,所以请原谅它的毫无意义(可以说它的目的是为了说明我的问题,所以猜测它不是毫无意义的)。

毫无疑问,出于某种原因,我会在这个问题上得到大量的分数,但我一直在阅读各种书籍(Learning Python The Hard Way,Python For Beginners)并在线阅读各种教程,但没有一个真正证实“您必须在 init 函数中添加每个变量”。因此,任何有助于更好地理解 __init__ 的帮助将不胜感激。

【问题讨论】:

    标签: python python-2.7 init


    【解决方案1】:

    首先:__init__() 函数的特殊之处在于它是在创建类的新实例时为您调用的。除此之外,它和其他函数一样是一个函数,如果你愿意,你甚至可以手动调用它。

    然后:您可以随意使用传递给函数的参数做您想做的事情。通常,传递给 __init__() 的参数存储在正在初始化的对象 (self) 中。有时,它们以其他方式使用,然后将结果存储在self 中,例如传递主机名并使用它来创建套接字 - 然后您只存储套接字。不过,您不必对参数做任何事情,您可以像在 First() 函数中一样忽略它们,该函数接收一个被忽略的参数 name。注意这个参数name和类似的属性self.name是不同的东西!

    注意事项:

    • 不过,忽略传递给__init__() 的参数并不常见,就像通常忽略参数一样。在某些情况下,它们是“保留的”,因此它们可以被派生类使用,但通常它们是无意的(我猜就像你的 First() 函数一样)。
    • 查看 PEP8,它是一个风格指南。坚持它会让其他人更容易阅读你的代码。例如。 First() 应改为 first()
    • 升级到 Python 3。我认为现在学习 Python 2 没有任何借口,除了维护之外几乎没有任何借口可以使用它。

    【讨论】:

      【解决方案2】:

      如果变量在逻辑上与对象本身有联系,最好在构造函数中设置:

      class Student:
      
          def __init__(self, name):
              self.name = name
      
          def print_name(self):
              print(self.name)
      

      如果变量只是某个函数的临时参数,那么,只需将其作为参数传递:

      class Cafeteria:
      
          def __init__(self):
              pass # nothing
      
          def process(self, student_name):
              print(student_name + " got lunch")
      

      在 Python 中,您不必像在 C++、C#、Java 等中那样声明所有可能的对象属性。我认为在构造函数中将它们初始化为某个空值仍然是个好主意(None,@ 987654324@),但这不是必须的。这很好:

      class Cafeteria:
      
          def set_today_menu(self, menu):
              self.menu = menu
      
          def process(self, student_name):
              print(student_name + " got " + self.menu)
      

      【讨论】:

      • 感谢 Messa,这与@Ulrich 的回答一起很有见地。我感谢有用的回应,而不是嘲笑和向下标记以进行更改^_^
      【解决方案3】:

      您不必这样做,但要访问它们,他们需要在某处设置...如果需要,您还可以在类中的任何定义之外设置默认值。

      def Class:
          RandomVariable = 5
          def __init__(self, val):
              self.RandomVariable = val
      

      【讨论】:

        【解决方案4】:

        这个方法被称为你的初始化器,你可以在其中满足一个对象,然后向它添加属性。如果我们要创建一个类,人类对象可能包含名称、年龄和性别属性,所有这些属性都使用初始化程序中的 self 指针绑定到对象。此外,初始化程序也可以修改全局变量。如果您想计算出生婴儿的数量,您可以从我们虚构的人类类初始化程序中添加一个全局计数器变量。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-26
          • 1970-01-01
          • 2016-05-17
          • 1970-01-01
          • 1970-01-01
          • 2013-10-18
          相关资源
          最近更新 更多