元类

元类:用来创建类的东西

类也是对象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)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值