面向对象的(classmethod)类方法和静态方法(staticmethod) 类方法示例及其区别

面向对象的(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),可以使用静态方法
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值