面向对象
魔法方法(内置方法)
- 在Python类里面,方法名以两个下划线开始和以两个下划线结束,那么这样的方法称为魔法方法,比如:
__init__
、__dict__
、__str__
等。 - 魔法方法具有特殊的功能,当需要完成某种操作的时候会自动调用魔法方法。
__init__
– 构造函数
- 当创建对象的时候会自动调用
__init__
魔法方法。 - 作用:给对象添加属性及给属性设置初始值。
class Person(object):
def __init__(self):
self.name = "李四"
self.age = 20
p1 = Person()
print(p1.name, p1.age)
- 带有参数的
init
方法,这里要注意self
参数不需要程序员手动传参,只需要给第二个参数及后面的参数传参。
class Person(object):
def __init__(self, new_name, new_age):
self.name = new_name
self.age = new_age
def show(self):
print("self:", id(self))
print(self.name, self.age)
p1 = Person("李四", 20)
print("p1:", id(p1))
p1.show()
---------------会发现self的id等于p1的id,说明self就是p1----------------------
p1: 2164594885240
self: 2164594885240
李四 20
__str__
- 当使用print函数直接打印当前指定对象的时候会自动调用
__str__
魔法方法。 - 作用:返回对象的描述信息,描述信息以字符串的形式返回,也就是说
str
方法返回的是一个字符串。 - 默认的
__str__
输出
<__mian__.类名 object at 16进制内存地址>
<__main__.Person object at 0x000001877F653198>
修改默认的str魔方方法
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
msg = "姓名: %s 年龄: %d" % (self.name, self.age)
return msg
p1 = Person(name="王五", age=20)
print(p1)
--------------------------------Out---------------------------------
姓名: 王五 年龄: 20
__del__
- 作用:检测对象是否被销毁,对象销毁内存会被释放。
- 调用: 当对象销毁的时候会调用__del__魔方方法。
对象销毁的情况
- 程序执行结束,程序中所使用的变量都要销毁。
- 程序正在执行,当对象的引用计数为0时,对象也会销毁。
- 引用计数:对象的内存地址被变量使用的次数。
- 扩展:利用
sys
模块中的getrefcount
函数查看变量被引用的次数。
import sys
class Person(object):
def __del__(self):
print("对象销毁了:", id(self))
p1 = Person()
print("p1:", id(p1))
print(p1)
p2 = p1
result = sys.getrefcount(p1)
print(result)
del p1
print("看__del__在这句话之前执行还是之后执行。")
__call__
- 把类的实例变成可调用的对象,就是对象可以直接加括号,一般使用对象都是:
obj.name
或者obj.getage()
,而__call__
魔法方法的作用就是:obj()
,相当于obj.__call__()
。 - 具体可以查看“Python进阶学习笔记”中“装饰器”的“类装饰器”。
__enter__
- 上下文管理器,即
with...as...
中必要的魔法方法之一,用于返回一个对象给as
后的变量,具体查看“Python进阶学习笔记”中的“上下文管理器”。
__exit__
- 上下文管理器,即
with...as...
中必要的魔法方法之一,当上下文管理器执行结束时,不论代码正常还是异常,都会先走__exit__
方法,具体查看“Python进阶学习笔记”中的“上下文管理器”。
普通内置属性mro()
- 获取类继承顺序,
类名.mro()
,返回列表,具体用法"Python基础学习笔记"搜索“多继承”。
普通内置属性dir()
- 查看对象的属性和方法信息—
dir(对象)
,返回的是一个列表。具体用法“Python基础学习笔记”搜索“子类不能使用父类的私有属性和私有方法”。
魔法属性(内置属性)
__doc__
__dict__
- 用于查看对象的属性信息,使用魔法属性
“__dict__”
,对象.__dict__
或类.__dict__
,返回字典形式的属性信息,详细用法Python基础学习笔记搜索“修改私有属性”。
__class__
- 用于获取对象的类,语法:
对象.__class__
,返回<class '__main__.类名'>
,详细用法可在Python基础学习笔记搜索“类属性和实例属性的操作”。
__all__
- 当本模块被以“
from 模块 import *
”的方式导入时,__all__
用来指定允许其他模块可以使用的功能代码,详细用法可以在Python基础学习笔记中搜索“导入模块”中的“2、from 模块名字 import 函数/类名
”。
__name__
- 用于判断是否是主模块,如果
__name__
的值为“__mian__
”,那么就说明当前模块是主模块,如果__name__
的值为模块的名字,那么说明当前按模块是被其他模块导入调用的。详细用法在Python基础学习笔记中搜索“判断是否是主模块”。
__bases__
- 用于查看类的父类是谁,(Python2中,不写()表示没有父类),语法:
类名.__bases__
。