联想说 Python 基础 18 - 特殊方法
特殊方法
目标:没啥特别需要掌握的,做一个补充
类方法和静态方法
类方法
什么是类方法?
前面我们写的方法是普通的方法,它们虽然写在类里面,但是真正调用的是对象,也就是说它们其实是属于对象的。
而这里说的类方法,它们才真正的是属于类的。这一小节没那么重要,就不花那么多字去便于理解了,下面直接从代码开始了。
在 Python 中要表示某个方法是 类方法,需要在方法上面加上 @classmethod 语法糖。
类方法的特点
格式:
@classmethod
def 类方法名称(cls):
pass
-
类方法上面有
@classmethod关键字修饰 -
类方法有一个默认的参数
cls它表示类本身(注意,不代表对象) -
类方法不能访问实例属性和方法
这里说的不能访问实例属性和方法,不是说它不能调用类里面的方法,而是不会影响对象调用的属性和方法
-
用类名称来调用
这里测验一下第三点:
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)
我们可以把实例的创建移交给类的内部实现,然后将实例作为方法的返回值返回出来。
由于实例的创建要移交给内部,所以外面不能通过创建对象来调用方法,这里就可以用类方法来实现了。
至于类方法的内部实现,应该没难度吧。
静态方法的运用
静态方法相对于类方法来说,更简单,它主要用来定义一些与类关联不大的辅助函数,它并不需要处理类的属性。所以这个,完全可以用其他的取代。不过如果是跟某个类相关的辅助方法,建议还是放到类里面用静态方法实现,避免与其他的类冲突。
魔法方法
魔法方法其实就是一些类似于构造方法,会因为某些条件自动触发执行的方法。比如构造方法就是在实例化对象的时候,会自动执行的方法。类似的还有很多,这里说两个:
-
__del__:析构函数当一个对象被垃圾回收器回收时,Python 自动调用这个方法。它可以用于释放对象使用的任何资源,如关闭文件,断开网络连接等。
-
__str__:对象的字符串表示当一个对象被转换为字符串或者和其他对象进行字符串操作时,Python会调用这个方法。例如,当我们尝试打印一个对象或者使用
str()函数转换一个对象为字符串时,__str__方法就会被调用。
演示
class Magic:
def __del__(self):
print("析构函数")
def __str__(self):
return "__str__ 方法"
mc = Magic()
print(mc)
结果:
__str__ 方法
析构函数
这两个方法都没有主动调用,其中析构函数当程序执行完成后,它里面的内容都会执行,所以 “析构函数” 都会被打印。
而 “str 方法” 如果不将对象当做字符串使用,它是不会被触发的,所以这里直接将对象当字符串打印了,而结果则是 _str_ 方法的返回值。
好啦,这部分就这么多了,现阶段了解一下就行。

浙公网安备 33010602011771号