实例方法、类方法、静态方法
实例方法
类中定义的方法默认都是实例方法,实例方法是由实例调用的方法,在定义时默认有 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 异常来结束迭代。 |