Discuss / Python / 一点小思考

一点小思考

Topic source

长日将尽

#1 Created at ... [Delete] [Delete and Lock User]

class Student(object):

    count = 0

    def __init__(self, name):

        self.name = name

        Student.count+=1

如果这里把最后的代码里的Student.count改成self.count会测试失败。前者是类属性,后者是对象属性,而每次调用的时候对象是不一样的,所以如果没有想错self.count恒定为0(每次调用都会被初始化)

Enkidu

#2 Created at ... [Delete] [Delete and Lock User]

没有给实例对象手动添加count属性,那么self.count则是访问的类中的count,也就是Student.count,所以不会恒定为0

彭湃

#3 Created at ... [Delete] [Delete and Lock User]

为什么不能使用如下呢?

self.count += 1

首先剖析一下等式:

self.count = self.count + 1

因为是等式,所以是赋值运算,先计算等式右侧,因为self实例没有count属性,那么会去获取类的count属性(因为实例存在一个内置方法__class__,可以找到对应类,所以实例可以访问/调用类属性和类方法,但是前提是没有重名),然后把结果赋值给self.count,此时相当于给实例self新增了属性count;

而为什么写在__init__方法中,因为init方法是类的初始化方法,每实例化一个实例,就会调用该方法(这个说法不严谨,结合python对象的生命周期来看,实例初始化的顺序先调用__new__方法,然后再调用__init__方法)有兴趣可以自行了解 前者的作用


  • 1

Reply