联想说 Python 基础 18 - 特殊方法

特殊方法

目标:没啥特别需要掌握的,做一个补充

类方法和静态方法

类方法

什么是类方法?

前面我们写的方法是普通的方法,它们虽然写在类里面,但是真正调用的是对象,也就是说它们其实是属于对象的。

而这里说的类方法,它们才真正的是属于类的。这一小节没那么重要,就不花那么多字去便于理解了,下面直接从代码开始了。

在 Python 中要表示某个方法是 类方法,需要在方法上面加上 @classmethod 语法糖。

类方法的特点

格式:

@classmethod
def 类方法名称(cls):
    pass
  1. 类方法上面有 @classmethod 关键字修饰

  2. 类方法有一个默认的参数 cls 它表示类本身(注意,不代表对象)

  3. 类方法不能访问实例属性和方法

    这里说的不能访问实例属性和方法,不是说它不能调用类里面的方法,而是不会影响对象调用的属性和方法

  4. 用类名称来调用

这里测验一下第三点:

class Animal:

    name = ""

    def bark(self):
        print("嘎嘎嘎")
        print("分数:", 0)

    @classmethod
    def class_method(cls):
        # 设置属性
        cls.name = "小橙"
        pass


# 类方法
ani = Animal()
ani.name = "小黑"
Animal.class_method()
print(ani.name)

说明:

  • 创建 Animal 类的对象 ani,然后给 ani 对象的 name 属性赋值为 “小黑”

    此时 ani.name 应该是 小黑

  • 通过 Animal.class_method() 调用类方法, 其中再次对 name 进行赋值为 “小橙”

  • 最后输出 ani.name 的值

问:ani.name 的值是什么?

如果值是类方法修改的 ”小橙“ 的话,那说明类方法是可以修改对象的属性的。这里最后的结果是 ”小黑“,所以类方法并没有修改对象的属性。

静态方法

与类方法类似的还有静态方法,静态方法是用 @staticmethod 修饰的方法,格式如下:

@staticmethod
def 静态方法():
    pass

静态方法与类方法不同的是,它的参数列表不需要写任何东西,也就是说一般都不会用它来操作类里面的任何东西。

如果有从其他语言转过来的,就格外需要注意了,这里和其他语言的区别还是有点大的。

既然不用它来操作类里面的东西,那要它来干嘛呢?

这是个好问题。从实际上来说,不论是类方法还是静态方法都不是面相对象所必须的方法,所以用不用都行,无所谓的。但如果你想用它的话,在哪可以用呢?

类方法的运用

首先类方法,由于它还是可以修改类的属性的,所以我们可以把它作为正式使用对象前的准备工作,比如单例(可能没听过,没关系)。

单例也就是单个实例,就是说只能创建一个对象,但是我们每次创建的对象都是不同的,那怎么创建单例对象?

class Singleton:

    _instance = None

    def __init__(self):
        if Singleton._instance:
            raise Exception("只能实例化一次")
        Singleton._instance = self

    @classmethod
    def get_instance(cls):
        if not cls._instance:
            cls()
        return cls._instance


s1 = Singleton.get_instance()
s2 = Singleton.get_instance()
s3 = Singleton()

print(s1)
print(s2)
print(s3)

我们可以把实例的创建移交给类的内部实现,然后将实例作为方法的返回值返回出来。

由于实例的创建要移交给内部,所以外面不能通过创建对象来调用方法,这里就可以用类方法来实现了。

至于类方法的内部实现,应该没难度吧。

静态方法的运用

静态方法相对于类方法来说,更简单,它主要用来定义一些与类关联不大的辅助函数,它并不需要处理类的属性。所以这个,完全可以用其他的取代。不过如果是跟某个类相关的辅助方法,建议还是放到类里面用静态方法实现,避免与其他的类冲突。

魔法方法

魔法方法其实就是一些类似于构造方法,会因为某些条件自动触发执行的方法。比如构造方法就是在实例化对象的时候,会自动执行的方法。类似的还有很多,这里说两个:

  1. __del__:析构函数

    当一个对象被垃圾回收器回收时,Python 自动调用这个方法。它可以用于释放对象使用的任何资源,如关闭文件,断开网络连接等。

  2. __str__:对象的字符串表示

    当一个对象被转换为字符串或者和其他对象进行字符串操作时,Python会调用这个方法。例如,当我们尝试打印一个对象或者使用 str() 函数转换一个对象为字符串时, __str__ 方法就会被调用。

演示

class Magic:
    def __del__(self):
        print("析构函数")

    def __str__(self):
        return "__str__ 方法"

mc = Magic()
print(mc)

结果:

__str__ 方法
析构函数

这两个方法都没有主动调用,其中析构函数当程序执行完成后,它里面的内容都会执行,所以 “析构函数” 都会被打印。

而 “str 方法” 如果不将对象当做字符串使用,它是不会被触发的,所以这里直接将对象当字符串打印了,而结果则是 _str_ 方法的返回值。

好啦,这部分就这么多了,现阶段了解一下就行。

posted @ 2023-10-14 15:44  笔锋微凉~~  阅读(15)  评论(0)    收藏  举报