一、类方法
类方法是从属于类对象那个的方法。类方法通过装饰器@classmethod来定义,格式如下
@classmethod
def 类方法名(cls,【形参列表】):
函数体
要点如下:
1.@classmethod必须位于方法的上面一行。
2.第一个cls必须有,cls指的是“类对象本身”(参考self)。
3.调用类方法的格式:“类名.类方法名(参数列表)”。参数列表中,不需要也不能给cls传值。
4.类方法中访问实例属性和实例方法会导致错误。
5.子类继承父类方法时,传入cls是子类对象,而非父类对象。
二、静态方法
Python中允许定义与“类对象”无关的方法,称为“静态方法”。
"静态方法"和在模块中定义的普通方法没有区别,只不过“静态方法”放到了“类的名字空间里面”,需要通过“类调用”。
静态方法通过装饰器@staticmethod来定义,格式如下:
@staticmethod
def 静态方法名(【形参列表】):
函数体
要点如下:
1.@staticmethod必须位于方法的上面一行
2.调用静态方法格式:“类名.静态方法名(【参数列表】)”。
3.静态方法中访问实例属性和实例方法会导致错误。
#测试类方法
class student:
company="sxt" #类属性
def __int__(self,name,score):
self.name=name
self.score=score
@classmethod #类方法
def printcompany(cls):
print(cls.company)
#print(self.name) 会报错,无法使用实例变量和实例方法
student.printcompany()
#测试静态方法
class student2:
company="sxt" #类属性
@staticmethod
def printage(n):
print("年龄是{0}".format(n))
student2.printage(19)
结果
再举一例:
class Geese:
'''雁类'''
neck = "脖子较长" # 定义类属性(脖子)
wing = "振翅频率高" # 定义类属性(翅膀)
leg = "腿位于身体的中心支点" # 定义类属性(腿)
def __init__(self): # 实例方法(相当于构造方法) 后面会专门说这个
print("我属于雁类!我有以下特征:")
print(Geese.neck) # 输出脖子的特征(也阔以通过self.属性名 访问)
print(Geese.wing) # 输出翅膀的特征
print(Geese.leg) # 输出腿的特征
s=Geese()
class Geese1:
'''雁类'''
count = 0 #类属性(下面用到此变量就必须在此定义)
def __init__(self): # 实例方法(相当于构造方法)
neck = "脖子较长" # 定义实例属性(脖子)
wing = "振翅频率高" # 定义实例属性(翅膀)
leg = "腿位于身体的中心支点,行走自如" # 定义实例属性(腿)
print("我属于雁类!我有以下特征:")
print(neck) # 输出脖子的特征
print(wing) # 输出翅膀的特征
print(leg) # 输出腿的特征
Geese1.count=Geese1.count+1
def shout(self):
print("66666666666666666")
s1=Geese1()
print()
s2=Geese1()
print()
s3=Geese1()
print()
print("一共调用了{0}次实例方法".format(Geese1.count))
s1.shout()
结果