类方法和静态方法


本章概述:python基础——面向对象中的类方法和静态方法


一、类属性和对象属性

从字面上其实也可以理解,类属性是在类中定义的属性,属于类,对象属性是创建实例初始化的属性,属于对象实例。

1
2
3
4
5
6
7
8
9
class Student:
name="z7sz" #类属性

def __init__(self,name):
self.name=name #对象属性

s1=Student('blog')
print(s1.name) #结果为blog,访问的是对象属性
print(Student.name) #结果为z7sz,访问的是类属性

访问类属性通过类名.属性名来访问。类属性和对象属性还是很容易理解的,这两种的访问方式也不同,在某些特殊时候,类属性可以通过对象来访问,比如该对象中没有该属性时,访问对象名.属性名则可以访问到类属性,但是最好不要这么做,因为这么做容易导致类属性和对象属性两者混乱。

二、类方法和静态方法

之前我们在类中定义的方法都是属于对象方法,换句话说就是这些方法都是跟对象相关的方法,是对象使用的到的方法。除此之外,类中还可以存在类方法和静态方法,这两类方法是属于类的,也就是说这两种方法不是对象该有的方法。

类方法用@classmethod装饰器修饰,并且第一个参数是cls,代表类本身;一般使用类名.方法名调用,不建议使用对象名.方法名调用;没有self,不可以使用类中其他对象的属性和方法;可以调用类方法、类属性和静态方法,通过cls调用。

静态方法通过@staticmethod 装饰器修饰;静态方法的写法跟写普通函数一样;一般使用类名.方法名调用,不建议使用对象名.方法名调用;既没有self也没有cls,因此不可以使用类中其他对象的属性和方法;形式参数中没有cls,不建议使用类属性\类方法\静态方法;静态方法是一个单独的方法,我们在定义类的时候,有时候部分函数跟类没关系,但是我们又需要用到它,我们可以在类外面单独定义这个函数,但是这样子的话会使代码变得难理解,因此使用静态方法,把这个单独的函数搬到类中表示。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Student:
def __init__(self,name):
self.name=name
print(type(self.name))

@classmethod
def if_str(cls,name):
if not isinstance(name,str):
name=str(name)
return cls(name) #处理完后返回类的实例对象

s1=Student('z7sz')
s2=Student.if_str(111) #显示为str类型

像上面的代码,写了一个函数用来判断传入的参数值是否为字符串,这个函数跟s1这个对象是没有啥关系的,实际上也可以在类外部定义函数并进行判断。

1
2
3
4
5
6
7
8
9
10
11
class Student_s:
def __init__(self,name):
self.name=name
Student.if_str(self.name)
@staticmethod
def if_str(name):
if not isinstance(name,str):
raise ValueError('name must be an str!')

s3=Student_s('zsz')
s4=Student_s(111) #会显示错误

静态方法和类方法二者并没有本质区别,静态方法通常是一个独立的函数,并没有和特定的对象绑定。

由于Python类中只能有一个初始化方法,不能按照不同的情况初始化类,所以类方法可以用来自定义初始化,比如上面的类方法样例,当然静态方法也可以,但是静态方法由于没有形参,所以每次都要写上类的名字,类名一改静态方法就会发生错误,所以静态方法更适合于用来定义跟类没有任何关系的函数,而类方法则可以用来自定义初始化。