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

本文共 2677 字,大约阅读时间需要 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 Dog
my_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) # 输出: 20
my_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 sys
    apple = Fruit()
    print(sys.getrefcount(apple))
    del apple
    print(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 obj
    fruit = 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/

    你可能感兴趣的文章
    memset初始化高维数组为-1/0
    查看>>
    Metasploit CGI网关接口渗透测试实战
    查看>>
    Metasploit Web服务器渗透测试实战
    查看>>
    MFC模态对话框和非模态对话框
    查看>>
    Moment.js常见用法总结
    查看>>
    MongoDB出现Error parsing command line: unrecognised option ‘--fork‘ 的解决方法
    查看>>
    mxGraph改变图形大小重置overlay位置
    查看>>
    MongoDB可视化客户端管理工具之NoSQLbooster4mongo
    查看>>
    Mongodb学习总结(1)——常用NoSql数据库比较
    查看>>
    MongoDB学习笔记(8)--索引及优化索引
    查看>>
    mongodb定时备份数据库
    查看>>
    mppt算法详解-ChatGPT4o作答
    查看>>
    mpvue的使用(一)必要的开发环境
    查看>>
    MQ 重复消费如何解决?
    查看>>
    mqtt broker服务端
    查看>>
    MQTT 保留消息
    查看>>
    MQTT 持久会话与 Clean Session 详解
    查看>>
    MQTT工作笔记0007---剩余长度
    查看>>
    MQTT工作笔记0009---订阅主题和订阅确认
    查看>>
    Mqtt搭建代理服务器进行通信-浅析
    查看>>