python-元类type创建类的类、自定义元类

0x00 你创建的类真的是类吗

class A:
    pass
print("打印类")
print(A)
print("打印类对象")
print(A())
print("类为自己增加属性")
A.attr1 = 10
print("类拷贝给一个变量")
B = A
print("判断某个属性是否为此类的")
print(hasattr(B,"attr1"))
print("类卓伟一个参数传入函数")
def printClass(A):
    print(A)
printClass(A)
  • 运行结果
打印类
<class '__main__.A'>
打印类对象
<__main__.A object at 0x000001EB361D0710>
类为自己增加属性
类拷贝给一个变量
判断某个属性是否为此类的
True
类卓伟一个参数传入函数
<class '__main__.A'>

结论 : 类同样也是⼀种对象 。

0x01 使用内建函数type动态创建类

  • type(类名, 由⽗类名称组成的元组(针对继承的情况,可以为空),包含属 性的字典(名称和值))
  • 使用内建函数动态创建类
# class A:
#     def __init__(self):
#         self.__age = 10
#         self.name = ""
#     def getAge(self):
#         return  self.__age
#     @staticmethod
#     def sMethod():
#         print("静态方法")
#     @classmethod
#     def cMethod(cls):
#         print("类方法")
def getAge(self):
    return  self.__age
@staticmethod
def sMethod():
    print("静态方法")
@classmethod
def cMethod(cls):
    print("类方法")

A = type('A',(),{"name":"","__age":10,"getAge":getAge,"sMethod":sMethod,"cMethod":cMethod})#等价于上面定义的类

a = A()
print(a.getAge())
a.sMethod()
a.cMethod()
  • 运行结果
10
静态方法
类方法

0x02 自定义元类来创建类

a = 10
type(a )# int
a.__class__#int
a.__class__.__class__#type

type 就是 python的内建元类

  • 下面开始自定义元类,并使用自定义元类创建对象
  1. 每个类都有一个__metaclass__属性 不定义那么就指向type,故我们要之定义元类就必须改变其指向,指向我们定义的元类函数,可以将通过这个元类创建的类的属性全部变为大写
def Mytype(cls,className, classFather, classAttrFunc):#方法一无需传入cls
    newAttrFunc = {}
    for name, value in classAttrFunc.items():#遍历
        if not name.startswith("__"):
            newAttrFunc[name.upper()] = value
    # 创建方法1
    return type(className, classFather, newAttrFunc)
     # 创建方法2
    return type.__new__(cls,className, classFather, newAttrFunc)
     # 创建方法3
    return super(Mytype,cls).__new__.(className, classFather, newAttrFunc)
	# super() 函数是用于调用父类(超类)的一个方法。super 是用来解决多重继承问题的
	#  Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx

class A(object,metaclass=Mytype):#python 3写法
    #__metaclass__ = Mytype  # 设置A类的元类为Mytype python2写法
    attr = "hello"


a = A()
print(hasattr(A, "attr"))
print(hasattr(A, "ATTR"))

  • for name, value in classAttrFunc.items():#for in 用于遍历元组、列表,如需遍历字典必须使用items将字典转换为列表进行遍历
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章