1、元类的结构图:
结合代码理解:
# -*- coding:utf-8 -*-
"""
@author: zhenyiyidejishu
@file: 元类.py
@time: 2024/4/10 22:15
@desc:
"""
num = 10
print(num.__class__)
s = "abc"
print(s.__class__)
class Person:
pass
p = Person()
print(p.__class__)
print("*"*20)
print(int.__class__)
print(str.__class__)
2、类的对象创建方式以及创建流程:
创建方式:
num=10
def run(self):
print(self)
xxx = type("Dog", (), {
"count":0, "run":run})
'''
type(name, bases, dict, **kwds)
type 传入三个参数时,用来创建类:
第一个参数 name 是被创建的类的名字,str 类型
第二个参数 bases 是被创建的类的父类,tuple 类型,不传默认是 (object,)
第三个参数 dict 是被创建的类的属性和方法,dict 类型
'''
print(xxx)
print(xxx.__dict__)
p = xxx()
print(p)
p.run()
创建流程:
1、检测类中是否明确__metaclass__属性
2、检测父类中是否存在__metaclass__属性
3、检测模块中是否存在__metaclass__属性
4、通过内置的type这个元类来创建这个类对象
注意:类的描述,方便理清逻辑思路,方便多人合作开发时的沟通,方便生产项目文档。
生产文档方式:
1、内置模块 pydoc
操作步骤:查看文档描述,python -m pydoc 模块名称
启动本地服务,浏览文档 python -m pydoc -p 6666
生产指定模块html文档:python -m pydoc -w 模块名称
使用其他方式第三方库:
3、元类的应用场景
拦截类的创建
修改类
返回修改之后的类
补充:属性相关补充
私有化属性:缩小属性的访问的权限,比如 只能在类的内部访问
注意:
Python并没有真正的私有化支持,但是可以使用下划线完成伪私有化的效果。
类属性和实例属性遵循相同的规则
x:公有属性,
类内内部访问
子类内部访问
模块内其他位置访问:1、类访问(父类和派生类) 2、 实例访问(父类实例和派生类实例)
跨模块访问:
1、import 形式导入
2、from 模块 import * 形式导入
class Animal:
x = 10
def test(self):
print(Animal.x)
print(self.x)
pass # 类的内部
class Dog(Animal):
def test2(self):
print(Dog.x)
print(self.x)
pass # 子类的内部
# 测试代码
a = Animal()
a.test()
print("*"*20)
d = Dog()
d.test2()
print("*"*20)
print(Animal.x)
print(Dog.x)
print(a.x)
print(d.x)
_y: 受保护权限
可以在
1、类的内部访问
2、子类内部访问
3、模块内其他位置访问
类访问 父类 或派生类
实例访问 父类实例或派生类实例中出现警告
4、跨模块访问
import 形式导入会产生警告
form module import * 形式导入 有__all__指明对应变量产生警告
无法访问__all__指明对应变量
A.py中访问私有化属性.py
from 私有化属性 import *
print(_a)
私有化属性.py中代码
__all__ = ["_a"]
_a = 111
class Animal:
_x = 10
def test(self):
print(Animal._x)
print(self._x)
pass # 类的内部
class Dog(Animal):
def test2