1、实例方法
定义:第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法(也可以传类的属性和方法);
调用:只能由实例对象调用。
2、类方法
定义:使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法);
调用:类和实例对象都可以调用。
3、静态方法
定义:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,但是方法体中不能使用类或实例的任何属性和方法;
调用:类和实例对象都可以调用。
4、写一个长方形的类,来讲解实例,类,静态方法的区别
class Rectangle:
def __init__(self, length, width): # 初始化方法
self.length = length # 把用户传的length转为实例自身的length
self.width = width # 把用户传的width转为实例自身的width
def perimeter(self): # 实例方法,只能由实例调用
return (self.length + self.width) * 2
def area(self): # 面积方法
return self.length * self.width
@classmethod # 装饰器,声明下面的方法是类方法
def features(cls): # 类方法,可以由实例调用,也可以由类调用
print('两边的长相等,两边的宽相等,长和宽的角度为90°')
@staticmethod # 装饰器,声明下面的方法是静态方法,相当于一个普通的函数
def sumdata(a, b):
return a + b
rec = Rectangle(5, 4) # 生成一个长方形的实例,名字是rec
print(rec.perimeter()) # 实例.方法
# 输出结果:18
Rectangle.features() # 类.方法
# 输出结果:# 两边的长相等,两边的宽相等,长和宽的角度为90°
rec.features() # 实例.方法
# 输出结果:# 两边的长相等,两边的宽相等,长和宽的角度为90°
print(Rectangle.sumdata(1, 2)) # 类调用静态方法--->既可以由类调用,也可以由实例调用
print(rec.sumdata(1, 2)) # 实例调用静态方法--->既可以由类调用,也可以由实例调用
# 输出结果:
# 3
# 3
5、 判断是哪种方法,可以用type(),也可以用inspect模块
# 5.1 通过type()查看对象是方法还是函数
print(type(rec.perimeter)) # 输出结果:
print(type(rec.features)) # 输出结果:
print(type(rec.sumdata)) # 输出结果:
5.2 inspect模块,判断某个对象是否是某种类型,返回值是布尔型
# 首先要import inspect 这个模块
# inspect.ismethod(对象) :如果对象是方法返回True
# inspect.isfunction(对象) :如果对象是函数返回True
import inspect
print(inspect.ismethod(rec.perimeter)) # 输出结果:True
print(inspect.ismethod(rec.features)) # 输出结果:True
print(inspect.isfunction(rec.sumdata)) # 输出结果:True
6、继承
# 6.1 完全继承Rectangle类
class Square(Rectangle):
pass
squ = Square(6, 6)
print(squ.perimeter())
print(squ.area())
# 输出结果:
# 24
# 36
6.2 部分继承
# 重写一些父类的方法,在这里重写了父类的__init__构造方法,原本父类有2个参的,给改成了1个参数,还把父类的2个属性的都传了一个值
class Square(Rectangle):
def __init__(self, side):
self.length = side
self.width = side
squ = Square(6)
print(squ.perimeter())
print(squ.area())
# 输出结果:
# 24
# 36
6.3 继承父类方法的同时,重写父类的方法:features(cls)
class Square(Rectangle):
def __init__(self, side):
self.length = side
self.width = side
@classmethod
def features(cls):
super().features() # 把父类的features方法拿到子类重写的features方法中,执行一次
print('长和宽也相等')
super().features() # 把父类的features方法拿到子类重写的features方法中,再次执行一次
squ = Square(6)
squ.features()
# 输出结果:
# 两边的长相等,两边的宽相等,长和宽的角度为90°
# 长和宽也相等
# 两边的长相等,两边的宽相等,长和宽的角度为90°
7、@property 声明下面的fun9方法是一个属性而不是方法,调用fun9的时候不能带括号
class Test1:
a = [1, 2, 3] # 类的属性,具有唯一性
def __init__(self):
self.b = [4, 5, 6] # 实例的属性,不唯一
@property
def fun9(self):
return 'Hello'
tt1 = Test1()
tt2 = Test1()
print(id(tt1.a)==id(tt2.a)) # 输出结果:True 所有的实例用的是同一个a
print(id(tt1.b)==id(tt2.b)) # 输出结果:False 每个实例用的是自己生成的b
print(tt1.fun9) # 输出结果:Hello
部分知识来源其他文档:
Python 实例方法、类方法、静态方法的区别与作用 - 失恋的蔷薇 - 博客园



