Python Class __init__ 确认

Python Class __init__ Confirmation

我正在努力理解 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)并且一直在阅读各种在线教程,但其中 none 实际上证实了 "You must add every variable in the init function"。因此,如果能帮助您更好地理解 __init__,我们将不胜感激。

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

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

首先:__init__() 函数的特殊之处在于它在创建 class 的新实例时被调用。除此之外,它是一个与任何其他函数一样的函数,您甚至可以根据需要手动调用它。

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

备注:

  • 不过,忽略传递给 __init__() 的参数并不常见,就像通常忽略参数一样。在某些情况下,它们是 "reserved",因此它们可以被派生的 classes 使用,但通常它们是无意的(我猜就像你的 First() 函数一样)。
  • 查看风格指南 PEP8。遵守它会让其他人更容易阅读你的代码。例如。 First() 应该是 first()
  • 升级到Python 3.我不认为现在有任何借口去学习Python 2和小借口除了维护一般使用它。

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

如果变量在逻辑上连接到对象本身,最好在构造函数中设置它:

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 等中那样声明所有可能的对象属性。我认为在构造函数中初始化它们仍然是个好主意一些空值(None0),但这不是必需的。这很好:

class Cafeteria:

    def set_today_menu(self, menu):
        self.menu = menu

    def process(self, student_name):
        print(student_name + " got " + self.menu)