1、类中的魔法方法
魔法方法是类或实例在特殊情况下自动执行的方法。魔法方法除了前文已经介绍过的__init__()构造方法外,还有__str__()打印方法和__del__()析构方法。
(1)__str__()打印方法
__str__()打印方法是打印描述实例信息的魔法方法,能够打印指定的信息,并自动执行。其语法格式如下:
class 类名(object):
def __str__(self):
方法体
下面是一个使用__str__()打印方法的示例:
- >>> class Car(object):
- ... def __init__(self, brand, color):
- ... self.brand = brand
- ... self.color = color
- ... self.max_speed = 240
- ... def __str__(self):
- ... return '品牌是{},颜色是{},最大时速是{}。'.format(self.brand, self.color, self.max_speed)
- ...
- >>> falali = Car('法拉利', '白色')
- >>> print(falali)
- 品牌是法拉利,颜色是白色,最大时速是240。
上述程序中,Car类的__init__()构造方法接收小汽车的品牌和颜色参数赋值给实例属性,并且初始化一个最高时速实例属性;__str__()打印方法的功能是一个格式化字符串,描述了小汽车的属性。使用Car类创建实例falali,并传入两个参数,使用print()函数打印实例,此时自动调用了Car类中的__str__()打印方法,打印字符串。
(2)__del__()析构方法
__del__()析构方法是在删除实例时自动运行的魔法方法。其语法格式如下:
class 类名(object):
def __del__(self):
方法体
下面是一个使用__del__()析构方法的示例:
- >>> class Car(object):
- ... def __init__(self, brand, color):
- ... self.brand = brand
- ... self.color = color
- ... self.max_speed = 240
- ... def __del__(self):
- ... print('{}要报废了,要去车管所注销了'.format(self.brand))
- ...
- >>> falali = Car('法拉利', '白色')
- >>> print(id(falali))
- 43663600
- >>> del falali
- 法拉利要报废了,要去车管所注销了
- >>> print(id(falali))
- Traceback (most recent call last):
- File "
" , line 1, in- NameError: name 'falali' is not defined
上述程序中,Car类中定义了一个析构方法,其功能是打印一个格式化字符串。当使用Car类创建实例falali后,调用id()方法获取falali实例的地址并打印;使用del falali删除falali实例,此时自动调用了Car类中的__del__()析构方法,打印字符串;再次调用id()方法获取falali实例的地址,Python解释器提示出错了,falali名称没有被定义,这是因为falali实例已经被删除了。
2、类中的静态方法
静态方法是类中不对当前属性和方法进行操作的方法。静态方法的特点如下:
①静态方法无隐含参数。
②无法通过self或cls调用属性。
③使用@staticmethod装饰。
静态方法的语法格式如下:
@staticmethod
def 方法名(参数):
方法体
调用静态方法有两种方式,一种是采用“类名.方法名(参数)”的形式;另一种是先实例化,再采用“实例名.方法名(参数)”的形式:
- >>> class Test():
- ... @staticmethod
- ... def info():
- ... print('成功进入静态方法')
- ...
- >>> Test.info() # 第一种调用方式
- 成功进入静态方法
- >>> s = Test()
- >>> s.info() # 第二种调用方式
- 成功进入静态方法
下面比较一下静态方法与类方法的相同点和不同点。
静态方法与类方法的相同点如下:
①都可以在类内调用。
②都可以通过实例调用。
静态方法与类方法的不同点如下:
①静态方法没有默认参数,类方法第一个默认参数为cls。
②静态方法内不能调用类属性或实例属性,类方法内只能调用类属性和类方法。