面向对象的(classmethod)类方法和静态方法(staticmethod)
类方法示例及其区别
-
说明:
- 定义时使用classmethod装饰器装饰的方法
- 使用时通过类名调用
-
作用:
- 可以创建对象或者简洁的创建对象
- 对外提供简单易用的接口
-
示例1:创建对象
class Person: def eat(self): print('我喜欢吃麻辣砂锅,不要麻椒和辣椒') @classmethod def test(cls): print(cls) print('这是类方法') # 创建对象,或者简洁的创建对象 @classmethod def create(cls): p = cls() p.age = 3 return p p1 = Person() p1.eat() # 通过类名调用 Person.test() # 创建或简洁的创建对象 p2 = Person.create() print(type(p2))
-
示例2:提供接口
class Number: def __init__(self, num1, num2): self.num1 = num1 self.num2 = num2 def add(self): return self.num1 + self.num2 def sub(self): return self.num1 - self.num2 def mul(self): return self.num1 * self.num2 def div(self): if self.num2 == 0: return None return self.num1 / self.num2 # 对外提供简单易用的接口 @classmethod def pingfanghe(cls, num1, num2): n1 = cls(num1, num1) n12 = n1.mul() n2 = cls(num2, num2) n22 = n2.mul() n3 = cls(n12, n22) return n3.add() sum= Number.pingfanghe(3, 4) print(sum)
静态方法
-
说明:
- 使用staticmethod装饰器装饰的方法(方法没有cls参数)
- 通过类名进行调用
-
示例:
class Person: @staticmethod def test(): print('static method test') # 创建对象 @staticmethod def create(): p = Person() return p Person.test() p = Person.create() print(p)
-
总结:
我们都知道,普通的类方法需要经过实例化对象后,才能调用使用
而经过@staticmethod和@classmethod装饰后的类方法这不需要实例化来调用,可以直接用类名来调用,类名.方法名(),但是也能够实例化后调用
这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。 -
区别:
@staticmethod不用表示自身对象的self参数,也不用表示自身类的cls参数,用法就像普通函数一样,调用类属性和方法时,用类名.属性名和类名.方法名()
@classmethond也没有表示自身对象的self参数,但是有一个表示自身类的参数cls,调用类属性和方法时,用cls.属性调用类属性,用cls().方法()调用类方法
注意:
- 凡是静态方法完成的功能都可以是类方法完成
- 若方法中没有使用到类名(cls),可以使用静态方法