名称 | 定义方法 | 权限 | 调用方法 |
实例方法 | 第一个参数必须是实例,一般命名为self | 可以访问实例的属性和方法,也可以访问类的实例和方法 | 一般通过实例调用,类也可以调用 |
类方法 | 使用装饰器@classmethod修饰,第一个参数必须是当前类的对象,一般命名为cls | 可以访问类的实例和方法 | 类实例和类都可以调用 |
静态方法 | 使用装饰器@staticmethod修饰,参数随意,没有self和cls | 不可以访问类和实例的属性和方法 | 实例对象和类对象都可以调用
|
下面修改类Stu的定义来展示这三种方法的区别
class Stu:#Stu类
school = "湘北高中" #类的属性
def __init__(self,name,age):
self.name = name
self.age = age
def play_basketball(self):
print("{name} 正在打篮球".format(name=self.name))
@classmethod
def sport(cls):#类方法,使用装饰器@classmethod修饰,第一个参数必须是当前类的对象,一般命名为cls
print("{school}的同学都喜欢篮球".format(school=cls.school))
@staticmethod
def clean():#静态方法,使用装饰器@staticmethod修饰,参数随意,没有self和cls
print("打扫教室卫生")
stu = Stu("樱木花道",17)
stu.play_basketball() #通过实例调用实例方法
Stu.play_basketball(stu) #通过类调用实例方法
Stu.sport() #通过类调用类方法
stu.sport() #通过实例调用类方法
Stu.clean() #通过类调用静态方法
stu.clean() #通过实例调用静态方法
print(stu.school) #通过实例访问类属性
stu.school = '山王工业' #只是增加了一个实例属性,类属性不会被修改
print(Stu.school) #通过类访问类属性
输出如下
在面向对象的设计理念中,方法必定属于某一个类,如果方法不属于某个类,那么它早就是函数了,就回归到了面向过程编程。方法属于某个类,但这个方法可能不会访问实例和类的任何属性或其他方法,对于这种方法,我们就应该把他设计成静态方法。
还有一种可能,一个方法会访问到类的属性,就像本实例中的sport方法,整个湘北高中的学生都喜欢篮球,这个方法就不是某个学生所特有的,而是整个类所拥有的一个方法,那么就需要把它设计成类方法。school就是类属性,既然类有这个属性,那么类实例化出来的对象也自然拥有这个属性,通过类和实例都可以访问到这个属性,但是要注意,这个属性是类的,因此不能通过实例化对它进行修改。
参考链接
http://www.coolpython.net/python_primary/oop/class.html
注:这是第一次接触面向对象编程,这篇论文作为开始的记录吧,这是目前对类的理解,后面对于类的理解继续在此基础上进行添加
时间:2020年8月24日21:18:23