博客
关于我
类方法:魔术方法和静态方法
阅读量:660 次
发布时间:2019-03-15

本文共 2643 字,大约阅读时间需要 8 分钟。

类中的类方法与静态方法

在Python中,类方法和静态方法是类层面的操作,而不是基于对象的。这些方法在类预定义后就可以使用,无需依赖于特定的对象实例。

类方法

类方法通过@classmethod装饰器定义,类方法的第一个参数通常是类cls,而不是对象self。类方法可以访问类属性,但不能访问对象属性。以下是一个典型的类方法示例:

class Dog:    @classmethod    def bark(cls):        print("Dog is barking. It's a", cls.__class__.__name__)# 类方法可以通过类名或对象实例调用:Dog.bark()  # 输出: Dog is barking. It's a Dogmy_dog = Dog()my_dog.bark()  # 同样输出: Dog is barking. It's a Dog

静态方法

静态方法使用@staticmethod装饰器,类似的,类方法和静态方法都可以在类预定义后调用。静态方法没有clsself参数,它们的行为是类本身的对象,无论是否是单独调用或通过对象实例调用。以下是一个静态方法的示例:

class Shape:    @staticmethod    def area(length, width):        return length * width# 静态方法可以通过类名或对象实例调用:Shape.area(4, 5)  # 输出: 20my_shape = Shape(4, 5)my_shape.area(4, 5)  # 同样输出: 20

类方法与静态方法的区别

  • 装饰器classmethod装饰器用于类方法,staticmethod用于静态方法。
  • 参数:类方法通常接受一个cls参数,静态方法可能不接受任何参数。
  • 可访问性:只能通过类访问,无法通过对象调用对象属性和方法。
  • 应用场景:类方法适合在类预定义后进行操作,通常用于基于类的初始化逻辑。静态方法可以在类预定义后立即使用,适合不依赖于特定实例的逻辑。

普通方法的区别

普通方法是依赖于对象的功能,需要传递self参数。这类方法依赖于对象实例,无法通过类名调用,只能通过对象实例调用。例如:

class Vehicle:    def move(self):        print("Vehicle is moving.")    # 车辆实例可以移动:my_car = Vehicle()my_car.move()  # 输出: Vehicle is moving.

类中的魔术方法

魔术方法是Python中特别用来操作对象内部状态的方法。在Python中,以__开头和结尾的双下划线命名的方法通常是魔术方法。

常见的魔术方法

  • __init__()

    这是对象初始化的魔术方法,用来初始化新对象的属性。默认实现会将实例属性设为给定值,但通常我们会为了定制初始化逻辑而重写它。

  • __new__()

    这是实例化对象的魔术方法。它负责创建对象的实例。如果没有定义__new__,会使用object类的默认实现来创建实例。

  • __call__()

    这是当对象作为函数被调用时,自动触发的魔术方法。例如,可以将某个对象实例当函数使用时,通过__call__方法执行特定操作。

  • __str__()

    这是当用print函数输出对象时,自动触发的魔术方法。返回的字符串值为对象的字符串表示。可以定义它来定制对象的输出显示形式。

  • __slots__

    用于限制实例的属性数量,减少内存占用。通过在类中定义__slots__,可以限制对象中可存储的属性数量。

  • __weakref__

    这是用于管理弱引用引用计数的魔法方法。在某些情况下,自动处理对象的引用关系。

  • 查看对引用计数的测试

    在Python中,可以使用sys.getrefcount()函数查看一个对象实例的引用计数。例如:

    import sysapple = Fruit()print(sys.getrefcount(apple))del appleprint(sys.getrefcount(apple))

    输出结果大概是:2,然后变成0或1,具体取决于其他地方是否有引用。不清楚的部分,可能会存在循环引用。

    删除对象实例

    现代Python实现对对象的删除是按引用计数激活__del__()方法,但具体细节由于Python解释性和实现细节,可能需要参考Python文档获得最准确的信息:

    del f

    这个结果在不同的Python版本和实现中可能会有所不同,特别是在涉及到Weakref的情况下。因此,建议在需要高效率的对象管理时,使用Weakref模块来手动管理对象实例的引用。

    实例化对象的__new__()方法

    每当你调用object()或子类的__init__方法创建一个新对象时,都会激活__new__方法。默认的__new__方法会创建一个无属性的、不构造完成对象,然后传给__init__方法进行初始化。

    class Fruit:    def __new__(cls):        obj = super(Fruit, cls).__new__(cls)        # 初始化代码,如果不进行初始化的话就不会构造完全对象        return objfruit = Fruit()

    对象作为函数的调用__call__()方法

    当一个对象实例作为函数被调用时,默认会调用__call__方法。这个方法可以通过定义它来实现对象的某些操作,例如:

    class Adder:    def __init__(self, value):        self.value = value    def __call__(self):        print("加法器被调用,当前值为:", self.value)adder = Adder(10)adder()  # 输出: 加法器被调用,当前值为: 10

    结论

    类方法和静态方法提供了在类层面上执行操作的能力,这非常有用,例如在类预定义时设置初始值或执行一些预处理操作。同时,魔术方法是理解Python对象内部机制的关键工具,它们是Python分析对象行为的基石。理解和正确使用这些特性,可以让你在开发过程中更加灵活高效地利用Python的强大功能。

    转载地址:http://vmxmz.baihongyu.com/

    你可能感兴趣的文章
    Mysql 共享锁
    查看>>
    MySQL 内核深度优化
    查看>>
    mysql 内连接、自然连接、外连接的区别
    查看>>
    mysql 写入慢优化
    查看>>
    mysql 分组统计SQL语句
    查看>>
    Mysql 分页
    查看>>
    Mysql 分页语句 Limit原理
    查看>>
    MySql 创建函数 Error Code : 1418
    查看>>
    MySQL 创建新用户及授予权限的完整流程
    查看>>
    mysql 创建表,不能包含关键字values 以及 表id自增问题
    查看>>
    mysql 删除日志文件详解
    查看>>
    mysql 判断表字段是否存在,然后修改
    查看>>
    MySQL 到底能不能放到 Docker 里跑?
    查看>>
    mysql 前缀索引 命令_11 | Mysql怎么给字符串字段加索引?
    查看>>
    mysql 协议的退出命令包及解析
    查看>>
    mysql 取表中分组之后最新一条数据 分组最新数据 分组取最新数据 分组数据 获取每个分类的最新数据
    查看>>
    mysql 四种存储引擎
    查看>>
    MySQL 基础模块的面试题总结
    查看>>
    MySQL 备份 Xtrabackup
    查看>>
    mysql 多个表关联查询查询时间长的问题
    查看>>