python __init__是一个类属性吗?

b5buobof  于 2023-04-10  发布在  Python
关注(0)|答案(3)|浏览(152)

让我们考虑下面的例子:

class Student:
    school = "stackoverflow"
    
    def __init__(self, name, course):
        self.name = name
        self.course = course

我知道__init__是构造函数。我知道它是一个方法(因为它是一个类中的函数)。或者,更准确地说,正如我从大量教程中了解到的那样-一个包含方法的属性。但是在这个例子中,__init__被认为是一个类属性吗?这样说对吗?或者只有school才被认为是类属性?
编辑:我明白,考虑到我的问题的本质,任何方法都可以取代__init __()。但我想用__init __()作为例子来理解。

neskvpey

neskvpey1#

在您的示例中,使用了Student类的示例函数__init__。它不被视为类属性或方法。类的特征是那些适用于该类的所有示例的特征。因为它在__init__方法之外定义,并由示例中Student class的所有示例共享,所以school是一个类属性。
示例方法,如__init__,操作示例特定的数据,并链接到类示例。它们需要一个类示例作为其第一个参数。(通常命名为self)。由于这些方法在示例级别而不是类级别工作,因此它们不被视为类属性。

cgyqldqp

cgyqldqp2#

是的,init是Student类的示例方法,而不是class属性。在您的示例中,class属性是school,它是一个静态属性,由该类的所有示例共享。

init方法是在创建类的示例时调用的一个特殊方法,用于以传入的值作为参数初始化示例的属性。由于它是对类的示例进行操作的方法,因此不被视为类的属性。

为了澄清,class属性是类本身的属性,而不是它的示例。它由类的所有示例共享,并且可以使用类名访问。例如,Student.school将返回school class属性的值。
总之,init是一个示例方法,用于初始化类示例的属性,而school是一个类属性,由类的所有示例共享。
编辑
我理解你的困惑。虽然init方法是为类的每个示例调用的,但它不被认为是类属性,因为它属于类的每个示例,而不是类本身。
换句话说,init方法在类定义中定义,但它不是类的属性,而是一个特殊的方法,在类的每个示例上调用它来初始化它的属性。init方法中的self参数是指正在初始化的类的特定示例。
简单来说,类属性是属于类本身的属性或方法,并由类的所有示例共享。另一方面,init方法是一个特殊的方法,在类的每个示例上调用它来初始化它的属性,因此它不是类属性。

yks3o0rb

yks3o0rb3#

这里的答案有点困难,因为概念上的想法和技术实现不一定一致。

  • 任何可以通过obj.foo访问的内容都是对象的属性。
  • 类是对象。
  • 我们为不同类型的属性保留不同的术语:
  • 函数属性称为方法。
  • 特殊的Python @property装饰器创建了“属性”,它的作用类似于属性,但却是方法。这是Python特有的,其他语言可能称之为getter/setter或类似的东西。
  • 属性/方法可能只存在于或作用于类的示例,而其他属性/方法可能存在于或作用于类。这些属性/方法被恰当地称为示例或类属性/方法。

到目前为止一切都很好,但是Python中的技术实现有点混乱,在这个意义上,示例方法 * 确实 * 作为“unbound”* 函数存在于类中。所以如果你传递正确的参数,你可以 * 在类上调用Student.__init__()

    • (“unbound”是Python 2的术语,但IMO易于理解)*

当在一个示例上访问这样一个方法时,你会得到一个“绑定”方法,它会自动隐式地获取它的self值。这就是Python实现中类方法和示例方法之间的真正技术差异:要创建一个接收cls对象的类方法,需要使用@classmethod装饰器。
但从技术上讲,他们都是一样的下面:用作对象的属性。
如果你想学习更多关于Python如何绑定方法的知识,我推荐@Martijn Pieters关于这个主题的文章,例如https://stackoverflow.com/a/15977850/476

相关问题