实例方法、类方法、静态方法

实例方法

类中定义的方法默认都是实例方法,实例方法是由实例调用的方法,在定义时默认有 self 参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

class Student:
# 类的构造方法也是实例方法
def __init__(self,name,age):
self.name = name
self.age = age

# 定义一个添加分数的方法,实例方法
def add_score(self,score):
self.score = score

# 使用方法
# 实例方法
jim = Student(Jim,25)
jim.add_score(98)
# 也可以由类名调用实例方法
Student.add_score(jim)

类方法

类方法是供类调用的一类方法,最少也要包含一个参数,通常为cls,python会将类本身绑定给cls参数,与实例方法最大的不同之处在于,需要使用 @classmethod 修饰器进行修饰,否则为实例方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14

class Student:
# 类的构造方法也是实例方法
def __init__(self,name,age):
self.name = name
self.age = age

@classmethod
def info(cls):
print('正在调用类方法:', cls)


# 调用方法
Student.info()

静态方法

静态方法是定义在类这个命名空间中的函数,不需要特殊参数,也无法调用类的任何属性和类方法。静态方法需要使用 @staticmethod 修饰器。

1
2
3
4
5
6
7
8
9
10
11
12

class Student:
@staticmethod
def info(name,age):
print(name,age)

# 静态方法的调用既可以使用类名,也可以使用类对象
# 使用类名
Student.info('Jim','28')
# 使用类对象调用静态方法
jim = Student()
jim.info('Jim','28')

一些方法

一些内置函数

函数名 作用
issubclass(class,classinfo) 判断是否为子类
isinstance(object,classinfo) 判断是否为一个已知的类型,考虑继承关系,而type()不考虑继承关系
hasattr(object,name) 判断对象是否包含对应的属性
getattr(object,name) 返回一个对象属性值
setattr(object,name) 设置属性值
delattr(object,name) 删除属性

基本魔法方法

方法名 作用
__init__ 实例创建时调用的初始化方法
__new__ 一个对象实例化时所调用的第一个方法, 在调用__init__前调用,执行了__new__,并不一定会进入__init__,只有__new__返回了当前类的实例,,才会进入当前类的__init__
__del__ 析构器,当一对象将要被系统回收时调用的方法
__str__ 打印一个对象的时候、%s格式化的时候、str强制转换数据类型的时候,触发__str__
__repr__

算术运算符

方法名 作用
__add__ +
__sub__ -
__mul__ *
__truediv__ /
__floordiv__ //
__mod__ %
__divmod__ (//, %)
__pow__ **
__lshift__ <<
__rshilft__ >>
__and__ &
__xor__ ^
__or__ |

反算术运算符:与算术运算符一一对应,当左操作不支持时调用,方法:r+相应的算术运算符
增量算术运算符:与算术运算符一一对应,方法:i+相应的算术运算符

一元运算符

方法名 作用
__neg__ 定义正号的行为
__pos__ 定义负号的行为
__abs__ 调用abs()
__invert__ 定义按位取反的行为

属性访问

方法名 作用
__getattr__ 定义当用户试图获取一个不存在的属性时的行为
__getattribute__ 定义当该类的属性被访问时的行为(先调用该方法,查看是否存在该属性,若不存在,接着去调用__getattr__)
__setattr__ 定义当一个属性被设置时的行为。
__delattr__ 定义当一个属性被删除时的行为。

定制序列

  • 如果希望定制的容器是不可变的话,你只需要定义__len__()__getitem__()方法。
  • 如果希望定制的容器是可变的话,除了__len__()__getitem__()方法,你还需要定义__setitem__()__delitem__()两个方法。
方法名 作用
__len__ 定义当被len()调用时的行为(返回容器中元素的个数)。
__getitem__(self, key) 定义获取容器中元素的行为,相当于self[key]。
__setitem__(self, key, value) 定义设置容器中指定元素的行为,相当于self[key] = value。
__delitem__(self, key) 定义删除容器中指定元素的行为,相当于del self[key]。

迭代器

把一个类作为迭代器,需要在类中实现两个魔法方法__iter__()__next__()

方法名 作用
__iter__(self) 定义当迭代容器中的元素的行为,返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。
__next__() 返回下一个迭代器对象。内部可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。