4.11. 类(2)

上一节讲了一些理论和基础,但都没展开,比如类变量(属性)与实例变量(属性),静态方法,实例方法,类方法等等,我们先讨论几张图,后面再讲这些的话会轻松一点儿

4.11.1. 理解类和对象

接上节的例子,我们画一个图

../_images/%E7%B1%BB%E5%8E%9F%E7%90%861.png

来解释一下,当加载一个类时,会为该类分配一块区域用来存在数据和方法,如图左所示,当使用 xiao_sun = Student('boy', 'xiao sun') 后,生成了一个新对象 xiao sun ,并为它分配了一块区域,如图右所示, 在它的属性里已经有了sex和name,因为生成实例对象后,会自动调用类的 __init__ 初始化方法,给对象新增两个属性,实例对象本身并不持有这些方法,当需要调用方法时,如 xiao_sun.run() , 其实python解释器会执行 Student.run(xiao_sun)

4.11.2. 类属性/实例属性

或者也可以称为类变量/实例变量,无所谓都一个意思。我们之前看到的属性都是实例也就是对象才持有的,类并持有,类持有的属性就是类属性,如下图所示:

../_images/%E7%B1%BB%E5%8E%9F%E7%90%862.png

这一次,我们把一个name属性放到了类的空间内,这个属性就称为类属性,表达方式如下:

class Student(object):

    name = '你猜'

    def __init__(self, sex, name):
        self.sex = sex
        self.name = name

    def run(self):
        print('i can run !!!')

类属性和实例属性的区别就是,类属性存在于类空间里,实例属性存在于对象空间里。

4.11.3. 类方法/实例方法/静态方法

刚刚我们已经有使用过实例方法了,大家应该注意到方法定义的第一个参数是self,即实例对象,这就是实例方法的特征,与其类似,类方法的第一个参数是 cls 即类,静态方法即不需要 self 、 也不需要 cls,看下面的例子:

class Student(object):

    name = '你猜'

    def __init__(self, sex, name):
        self.sex = sex
        self.name = name

    def say_self_name(self):
        print(self.name)

    @classmethod
    def say_cls_name(cls):
        print(cls.name)

    @staticmethod
    def say_whose_name():
        print('whose name?')

# 生成对象
xiao_sun = Student('boy', 'xiao sun')

# 使用类调用类方法
Student.say_cls_name()
# 使用类调用实例方法
Student.say_self_name()  # 会报错
# 使用类调用静态方法
Student.say_whose_name()

# 使用对象调用类方法
xiao_sun.say_cls_name()
# 使用对象调用实例方法
xiao_sun.say_self_name()
# 使用对象调用静态方法
xiao_sun.say_whose_name()

换句话说,类方法,可以操作类属性,实例方法可以操作实例属性,静态方法谁都操作不了