让我们考虑下面的例子:
class Student:
school = "stackoverflow"
def __init__(self, name, course):
self.name = name
self.course = course
我知道__init__
是构造函数。我知道它是一个方法(因为它是一个类中的函数)。或者,更准确地说,正如我从大量教程中了解到的那样-一个包含方法的属性。但是在这个例子中,__init__
被认为是一个类属性吗?这样说对吗?或者只有school
才被认为是类属性?
编辑:我明白,考虑到我的问题的本质,任何方法都可以取代__init __()。但我想用__init __()作为例子来理解。
3条答案
按热度按时间neskvpey1#
在您的示例中,使用了
Student
类的示例函数__init__
。它不被视为类属性或方法。类的特征是那些适用于该类的所有示例的特征。因为它在__init__
方法之外定义,并由示例中Student class
的所有示例共享,所以school
是一个类属性。示例方法,如
__init__
,操作示例特定的数据,并链接到类示例。它们需要一个类示例作为其第一个参数。(通常命名为self
)。由于这些方法在示例级别而不是类级别工作,因此它们不被视为类属性。cgyqldqp2#
是的,init是Student类的示例方法,而不是class属性。在您的示例中,class属性是school,它是一个静态属性,由该类的所有示例共享。
init方法是在创建类的示例时调用的一个特殊方法,用于以传入的值作为参数初始化示例的属性。由于它是对类的示例进行操作的方法,因此不被视为类的属性。
为了澄清,class属性是类本身的属性,而不是它的示例。它由类的所有示例共享,并且可以使用类名访问。例如,Student.school将返回school class属性的值。
总之,init是一个示例方法,用于初始化类示例的属性,而school是一个类属性,由类的所有示例共享。
编辑
我理解你的困惑。虽然init方法是为类的每个示例调用的,但它不被认为是类属性,因为它属于类的每个示例,而不是类本身。
换句话说,init方法在类定义中定义,但它不是类的属性,而是一个特殊的方法,在类的每个示例上调用它来初始化它的属性。init方法中的self参数是指正在初始化的类的特定示例。
简单来说,类属性是属于类本身的属性或方法,并由类的所有示例共享。另一方面,init方法是一个特殊的方法,在类的每个示例上调用它来初始化它的属性,因此它不是类属性。
yks3o0rb3#
这里的答案有点困难,因为概念上的想法和技术实现不一定一致。
obj.foo
访问的内容都是对象的属性。@property
装饰器创建了“属性”,它的作用类似于属性,但却是方法。这是Python特有的,其他语言可能称之为getter/setter或类似的东西。到目前为止一切都很好,但是Python中的技术实现有点混乱,在这个意义上,示例方法 * 确实 * 作为“unbound”* 函数存在于类中。所以如果你传递正确的参数,你可以 * 在类上调用
Student.__init__()
。当在一个示例上访问这样一个方法时,你会得到一个“绑定”方法,它会自动隐式地获取它的
self
值。这就是Python实现中类方法和示例方法之间的真正技术差异:要创建一个接收cls
对象的类方法,需要使用@classmethod
装饰器。但从技术上讲,他们都是一样的下面:用作对象的属性。
如果你想学习更多关于Python如何绑定方法的知识,我推荐@Martijn Pieters关于这个主题的文章,例如https://stackoverflow.com/a/15977850/476。