内部类
概念:类的内部定义的类,主要目的是为了更好抽象现实世界。
注意事项:一般情况下不使用内部类,这样会使程序结构复杂,但是理解内部类有助于理解模块的调用。
示例:People类中又定义了Father类和Mother类两个内部类。创建内部类的实例化对象,可以通过外部类的实例化对象调用内部类完成,如Lisi = Zhangsan.Father();也可以直接使用外部类名调用内部类,如Liming = People.Mother()。
class People():
code = 0
class Father():
code = 1
class Mother():
code = 2
zhangsan = People()
lisi = zhangsan.Father() # 第一种实例化方法
print(lisi.code) # 输出结果:1
liming = People.Mother() # 第二种实例化方法
print(liming.code) # 输出结果:2
结论:内部类调用有两种方式。
1.直接使用外部类调用内部类;
2.先对外部类进行实例化,然后再实例化内部类。
魔术方法
在Python语言中,所有以双下划线“__”包起来的方法,都统称为“魔术方法”。
这些方法在实例化时会自动调用,
比如“_str__()”、“__init__()”、“__del__()”等。
使用魔术方法可以构造出非常优美的代码,比如将复杂的逻辑封装成简单的API等。
魔术方法中的“__init__()”方法一般叫做构造函数,用于初始化类的内部状态和参数。
如果不提供,Python语言会给出一个默认的“__init__()”方法
魔术方法中的“__ del __()”函数叫做析构函数,用于释放对象占用的资源。“__del__()”函数是可选的,
如果不提供,Python语言会在后台提供默认析构函数。
魔术方法中,有些可以实现属性访问控制的功能,如“__getattr__(self,name)”,
“__setattr__(self,name,value)”方法等。
示例:魔术方法
class People():
name = "人"
def __init__(self, n="非洲人"):
self.name = n
print("我是构造函数", self.name) # 重写构造函数
def __del__(self):
print("我是析构函数", self.name) # 重写析构函数
zhangsan = People()
lisi = People("欧美人")
zhangsan.__del__() # 调用析构函数
print(zhangsan)
del zhangsan
# print(zhangsan) 出现错误,因为del后,对象就不存在了
输出结果:
我是构造函数 非洲人
我是构造函数 欧美人
我是析构函数 非洲人
<__main__.People object at 0x000001EAF4D09358>
我是析构函数 非洲人
我是析构函数 欧美人
示例中展示了对于这些魔术方法,在创建对象时可以自动执行。当对象自动执行析构函数“A.del()”后,对象仍然存在,但是在调用“del A”,后,对象就已经被回收删除,无法再次使用。