2.Python 类的构建

1. Class

1. class的定义

1
2
3
4
class <类名每个单词首字母大写>:
"""类描述块"""
#解释
语句
  • ​ 类描述:在类定义后的首行,以独立字符串形式定义,<类名>.__doc__属性来访问。

2. 初始化方法和self

1
2
3
class <类名>:
def __init__(self, [参数列表]):
语句块

类实例化时所用的方法,可以接收参数并完成初识操作。

__init__:

  • 参数:第一个参数是self,表示类实例自身其它参数是实例参数
  • 返回值:构造方法没有返回值,或者返回None,不然TypeError.

self: 在类定义内部代表类的实例

  • self是Python面向对象约定的一个类参数
  • self代表类的实例,在类内部,self用于组合访问实例相关的属性和方法
  • 相比,类名代表类对象本身

3. 类的属性和方法

  • 类的属性:类中定义的变量,用来描述类的一些特性参数
  • 类的方法:类中定义且与类相关的函数,用来给出类的操作功能
  • 属性和方法是类对外交互所提供的两种接口方式
属性
  • 类属性:类对象的属性,由所有实例对象所共享

  • 实例属性:实例对象的属性,由各实例对象所共享

    1
    2
    3
    4
    class <类名>:
    <类属性名> = <类属性初值>
    def __init__(self, [参数列表]):
    self.<实例属性名> = <实例属性初值>

    类属性实例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class PeopleClass:
    init_num = 0
    def __init__(self, name, age):
    self.name = name
    self.age = age
    PeopleClass.init_num += 1

    p1 = PeopleClass("Tom", 23)
    p2 = PeopleClass("Jack", 24)
    print("类总数:", PeopleClass.init_num)
    print(p1.name, p2.name)

    >>
    类总数: 2
    Tom Jack

    每次实例化,都会调用__init__方法,那么累变量改变为2,因此类属性也为2。

    属性是类内部定义的变量

    • 类属性:类对象的属性,有所有实例对象所共享
      • 访问:<类名>.<类属性> 或 <对象名>.<类属性>
    • 实例属性:实例对象的属性,由各实例对象所独享
      • 访问:<对象名>.<实例属性>
方法

方法是类内部定义的函数

  • 实例方法:实例对象的方法,由各实例对象独享,最常用的形式
  • 类方法: 类对象的方法,由所有实例对象共享
  • 自由方法:类中的一个普通函数,由类所在命名空间管理,类对象独享
  • 静态方法:类中的一个普通函数,由类对象和实例对象共享
  • 保留方法: 由双下划线开始和结束的方法,保留使用,如__len__()

实例方法

1
2
3
4
class <类名>:
def <方法名>(self, [参数列表]):
语句

​ 实例方法采用<对象名>.<方法名>([参数列表])方式使用

类方法

l 类方法是与类对象相关的函数,由所有实例对象共享

1
2
3
class <类名>:
@classmethod
def <方法名>(cls, [参数列表]):

类方法采用<类名>.<方法名>([参数列表]) 或<对象名>.<方法名>([参数列表])方式使用。

  • 类方法至少包含一个参数,表示类对象,一般用cls
  • @classmethod 是装饰器,类方法定义所必须
  • 类方法只能操作类属性和其他类方法,不能操作实例属性和实例方法

类方法的使用

自由方法

自由方法是定义在类命名空间中的普通函数

1
2
3
class <类名>:
def <方法名>(cls, [参数列表]):
语句

自由方法采用<类名>.<方法名>([参数列表]) 方式使用。<类名>表示命名空间。

  • 自由方法不需要selfcls这类参数,可以没有参数
  • 自由方法只能操作类属性和类方法,不能操作实例属性和实例方法
  • 自由方法的使用只能使用<类名>

静态方法

静态方法是定义在类中的普通函数,能够被所有实例对象共享

1
2
3
4
class <类名>:
@staticmethod
def <方法名>( [参数列表]):
语句

静态方法采用<类名>.<方法名>([参数列表]) 或<对象名>.<方法名>([参数列表])方式使用。

  • 静态方法可以没有参数,可以理解为定义在类中的普通函数
  • @staticmethod是装饰器,静态方法定义所必须
  • 静态方法只能操作类属性和其他类方法, 不能操作实例属性和实例方法
  • 相比自由方法,静态方法能够使用类名对象名两种操作方式使用

4. 类的析构函数

1
2
3
class <类名>:
def __del__(self):
语句

析构函数在真实删除实例对象是被调用。

  • 函数名和参数:Python解释器内部约定,保留方法
  • 调用条件:当实例对象被真实删除是,才调用该函数内语句
  • 真实删除:当前对象的引用次数为0或当前程序退出(垃圾回收机制)

Python类的内存管理

  • 实例对象:真实创建的对象,分配对象内存
  • 实例引用:实例的指针,仅分配指针内存

内存管理机制:

  • 在删除对象前,Python解释器会检查引用次数

  • 引用次数不为0,则仅删除当前引用;0,则删除对象

  • 如果程序退出,则由垃圾回收机制删除对象

    利用sys.getrefcount(<对象名>)获取对象引用次数,其返回值为被引用值+1.