• Python进阶学习(3)绑定方法


    一、绑定方法

    1.类方法 (绑定)

    通过装饰器@classmethod 进行装饰,绑定类cls

    类方法操作一定是类属性,因为类方法无法通过self去获取对象属性
    
    • 1
    class MyClass:
        class_variable = 0#对于类的全局变量
    
        def __init__(self, value):
            self.instance_variable = value
    
        @classmethod
        def class_method(cls):
            print("This is a class method")
            print(f"Class variable: {cls.class_variable}")
    
        def instance_method(self):
            print("This is an instance method")
            print(f"Instance variable: {self.instance_variable}")
    
    # 调用类方法
    MyClass.class_method()
    
    # 创建实例并调用实例方法
    obj = MyClass(10)
    obj.instance_method()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    2.主要用途包括

    1.访问类变量:类方法可以访问和修改类的属性,而不需要实例化对象。这使得类方法可以用来操作类级别的数据。

    2.工厂方法:类方法可以作为工厂方法,用来创建类的实例。这种方式可以提供更灵活的对象创建方式。

    3.在实例化之前进行预处理:类方法可以在实例化对象之前执行一些预处理操作,例如验证参数等。

    4.提高代码可读性:通过使用@classmethod装饰器,可以清晰地表明这是一个类方法,有助于代码的可读性和维护性。

    3.静态方法(非绑定)

    静态方法:通过装饰器@staticmethod进行装饰,为了方便代码统一管理,把类外面的某一个功能函数统一放到类里面管理,静态方法不能操作类的所有东西包括对象也是一样

    单纯的一个方法:比如单纯的输出文字,单纯的计算某些数值,不改变任何属性
    一句话,不需要用self,或者cls进行操作的都可以变成静态方法

    class MathUtils:
        @staticmethod
        def add(x, y):
            return x + y
    
        @staticmethod
        def multiply(x, y):
            return x * y
    
    # 调用静态方法
    sum_result = MathUtils.add(3, 5)
    product_result = MathUtils.multiply(3, 5)
    
    print("Sum:", sum_result)
    print("Product:", product_result)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4.主要用途包括

    1.与类的关联性较弱:静态方法与类的状态无关,不需要访问类变量或实例变量。因此,它通常用于实现与类相关但不依赖于实例状态的功能。

    2.代码组织:将相关的函数放在类的命名空间下,有助于更好地组织代码。

    3.提高代码可读性:通过使用@staticmethod装饰器,可以清晰地表明这是一个静态方法,有助于代码的可读性和维护性。

    5.检查类型

    type() # 查询单个数据类型

    类如何查询类型

    查询对象是否有指定的类生成 isinstance(obj/对象, cls/类)
    查询是否有继承关系 issubclass(cls/子类,class_tuple/父类)

    import time
    class Student:
        # 类属性
        number = 0
    
        def __init__(self, name):
            self.name = name
    
        def sleep(self):
            print(f"{self.name}在睡觉")
    
    
        @classmethod
        # 这个就是代表装饰类方法
        # cls 是类本身
        # 改变类属性是谁作用,类作用
        def count(cls):
            cls.number += 1
            return cls.number
    
        @staticmethod
        def setTime():
            print(f"{time.strftime('%Y-%m-%d')}")
    
    
    student1 = Student("笑脸")
    Student.count()
    
    student2 = Student("小虎同学")
    Student.count()
    
    student3 = Student("无风柳自断")
    Student.count()
    
    student4 = Student("爱丽丝")
    Student.count()
    
    print(Student.number)
    
    # 其中一个对象,也是和类是一样的
    
    
    student5 = Student("学员1909")
    student5.count()
    print(Student.number)
    
    student5.setTime()
    
    print(isinstance(student5, Student))
    print(issubclass(Student, object))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
  • 相关阅读:
    java毕业生设计原创网络文学管理系统计算机源码+系统+mysql+调试部署+lw
    VTN4系列多通道振弦模拟信号采集仪模拟通道值和振弦传感器温度通道值修正
    原地算法(数组向)
    QA测试开发工程师面试题满分问答15: 讲一讲InnoDB和MyISAM
    ptyhon flask SSE 浏览器和服务器实时通信-例子实时推送随机数到前端画echart曲线图
    Java--字节内存流--ByteArrayInputStream与ByteArrayOutputStream
    ES6 入门教程 16 Reflect 16.1 概述
    LeetCode 1175. 质数排列(质数判断+组合数学)
    【Kubernetes | Pod 系列】Pod 的基本管理(2)——对 Pod 的查询
    mybatis、mybatisPlus
  • 原文地址:https://blog.csdn.net/Appppiiiiggg/article/details/136630680