元类:用来创建类的东西
类也是对象,globals查看所有的全局变量对象引用
当定义一个函数:类 全局变量时,其实就是创建一个‘对象’,然后再globals获取的这个字典中添加一个名字,让这个名字指向刚刚创建的对象空间而已
使用变量名:先到字典里面找,有直接用,没有就到__builtins__内建里面找,没有就报not found error
参考:https://www.jianshu.com/p/119cfad15487
动态传递参数创建类
def choose_class(name):
if name == 'Foo':
class Foo(object):
pass
return Foo # 返回的是类,不是类的实例
else:
class Bar(object):
pass
return Bar
MyClass = choose_class('Foo')
print(MyClass) # 函数返回的是类,不是类的实例
print(MyClass()) # 你可以通过这个类创建类实例,也就是对象
type创建类
# type第一种用法
type("100")
# type第二种用法
class Test1:
num = 100
num2 = 200
# 创建类
Test2 = type("Test2", (), {'num':100, 'num2':200})
help(Test1)
help(Test2)
help(type)
type创建类的运用
# type第一种用法
type("100")
# type第二种用法
class Test1:
num = 100
num2 = 200
# 创建类
Test2 = type("Test2", (), {'num':100, 'num2':200})
# 继承类Test2
Test22 = type('Test22', (Test2,), {})
# 实例方法
def test_2():
print('---实例方法---')
Test3 = type('Test3', (), {'test_2': test_2})
# 类方法
@classmethod
def test_3(cls):
print('---这是类方法---')
Test4 = type('Test4', (), {'test_2': test_2, 'test_3': test_3})
# 静态方法
@staticmethod
def test_4():
print('---这是静态方法---')
Test5 = type('Test5', (), {'test_2': test_2, 'test_3': test_3, 'test_4': test_4})
#help(Test5)
b = Test5
b.test_2()
b.test_3()
b.test_4()
#结果
#---实例方法---
#---这是类方法---
#---这是静态方法---
元类就是用来创建类的'东西',元类就是类的类:
元类创建出来的对象叫做:类
类创建出来的对象叫做:实例对象
class T():
pass
t = T()
print(t.__class__) # 查询是谁创建了实例对象,类对象
print(t.__class__.__class__) # 查询是谁创建的类:元类type
print(t.__class__.__class__.__class__) # 查询是谁
# 结果
# <class '__main__.T'>
# <class 'type'>
# <class 'type'>
元类的应用
def upper_attr(class_name, class_parents, class_attr):
# 遍历属性字典,把不是__开头的属性名字变为大写
new_attr = {}
for name, value in class_attr.items():
if not name.startswith('__'):
new_attr[name.upper()] = value
# 调用type来创建一个类
return type(class_name, class_parents, new_attr)
class Foo(object, metaclass=upper_attr):
bar = 'zip'
print(hasattr(Foo, 'bar'))
print(hasattr(Foo, 'BAR'))
f =Foo()
print(f.BAR)