「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战」。
前言
从上篇《类和对象》学习了如何定义类、使用类,还有关于属性和方法的定义和使用,更有方法重写和继承比较重要的知识点进行讲解,而本篇呢,从中抽取部分内容,单独进行精讲和演示。
类有三大方法
实例方法(self)、类方法(@classmethod)、静态方法(@staticmethod)
类方法
被@classmethod装饰的方法叫类方法
- 记得上篇关于类和实例(对象)有一个例子:print(self)输出类对象(实例)的地址,而self.__class__才是类本身;那么print(cls)输出就是类本身,而cls.__class__只是个类型:<class 'type'>
class A:
name = "类属性"
def __init__(self):
self.age = 10
@classmethod
def func(cls):
print(cls)
print(cls.__class__)
print("能调用类属性:{},但不能调用实例属性".format(cls.name))
复制代码
- 类方法不能调用实例属性,却能调用类属性、实例方法和静态方法,也能被类和实例调用。
实例方法
定义在类中的方法(第一个参数为self)且只能被实例调用的就叫实例方法;也就是说不能被什么类方法和静态方法调用;可以被类调用
class A:
def func(self):
self.name = "使用了实例属性的实例方法"
@classmethod
def func1(cls):
try:
cls.func()
except:
print("类方法不能调用实例方法")
复制代码
- tips:当实例方法没有用到实例属性的时候,是可以被类方法调用的。
静态方法
被@staticmethod装饰的叫静态方法,静态方法默认不传参数(当然可以使用参数,但是不能调用类属性和实例属性);能被对象和类调用
- 试想一下,静态方法里面既不调用属性也不调用方法,能做什么呢?
# 定义静态方法
class A:
@staticmethod
def func():
print("它有自己用途,但是却不调用属性和方法")
print("如要调用属性和方法,可以使用支持类调用的方式")
复制代码
- 在静态方法中,不会涉及到类中的方法和属性的操作,可以理解为将静态方法寄存在该类的命名空间中。即使要用到类其他属性也是通过类去调用的,它不能去改变属性的值。
class V:
name = "类属性"
def func(self):
self.name = "使用了实例属性的实例方法"
@staticmethod
def func1():
return V.name
v = V()
print(v.func1())
复制代码
扩展
关于类定义的三个方法及属性相互调用关系,可能比较复杂,使用一个案例来说明,更多注释也写清楚了
class A:
age = "类属性==>能被实例方法和类方法调用"
def __init__(self):
"""构造函数"""
self.name = "实例属性==>能被实例和类调用,不能被类方法调用"
def func1(self):
"""实例方法"""
print("*"*50)
print("实例方法==>能调用所有方法和属性")
self.func2()
self.func4()
print(self.name)
print(self.addr)
print(self.age)
print("*"*50)
@classmethod
def func2(cls):
"""类方法"""
print("*"*50)
cls.addr = "类变量==>能被实例和类方法调用"
print("类方法==>能被实例和类调用")
print("*"*50)
@classmethod
def func3(cls):
"""类方法"""
print("*"*50)
try:
cls.name
except:
print("类方法==>不能调用实例属性")
try:
A.func1(cls)
except:
print("类方法==>只要类方法调用的实例方法使用了实例属性就不能调用它")
cls.func2()
print(cls.addr)
cls.func4()
print("*"*50)
@staticmethod
def func4():
"""静态方法"""
print("*"*50)
print("静态方法==>能通过类的形式调用属性和方法")
print(A.age)
A.func2()
try:
A.func1(1)
except:
print("静态方法==>不能通过类的形式调用实例方法")
print("*"*50)
a = A()
a.func1()
a.func3()
复制代码




近期评论