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的内建元类
- 下面开始自定义元类,并使用自定义元类创建对象
- 每个类都有一个__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将字典转换为列表进行遍历