Python29_元类

类也是对象

ps:python中一切皆对象

def:在大多数语言中,类就是一组用来描述如何生成一个对象的代码段,但是在python中,类同样也是一种对象

类是元类的实例

验证

class Test:
	print("hello world")
#就此代码段,运行会输出hello world

动态的创建类

def choose_class(name):
    if name == "foo":
        class Foo:
            x = 3
        return Foo
    else:
        class Bar:
            pass
        return Bar

a = choose_class("foo")
print(a.x)

一般不建议这么写,函数、类属于“一等公民”,不宜定义在其他东西内部,(方法除外,在类里面)

使用type创建类

ps:type有两个功能,但是这只是为了兼容其他版本,这样做是非常不好的,一个函数就应该明确的只有某一个功能

type可以像这样工作:type(类名,由父类名称组成的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))

def func(self):
    print(self.num)


Test = type("Test", (), {"num": 0, "func": func})  # 此即元类
t = Test()
t.num = 100
t.func()

可以勉强这么理解:元类:最原始的创建类的东西

type中的继承

class Animal:
    def eat(self):
        print("---eat---")
class Dog(Animal):
    pass
wangcai = Dog()
wangcai.eat()
Cat = type("Cat",(Animal,),{})
hellokitty = Cat()
hellokitty.eat()

metaclass属性

class Foo:
	__metaclass__ = something..	#something需要是一个元类,即指定谁创建这个类,如果不写,则先到父类里面找,如果没有,再到内建模块里面找,如果内建模块里还没有,就用python默认的代码进行创建
	---省略---

自己定义元类

python3中

def uppper_attr(future_class_name, future_class_parents, future_class_attr):
    # 遍历属性字典,把不是__开头的属性名字变为大写
    newAttr = {}
    for k, v in future_class_attr.items():
        if not k.startswith("__"):	#把类中所有的普通方法和普通属性的名字大写
            newAttr[k.upper()] = v
    return type(future_class_name, future_class_parents, newAttr)

class Foo(metaclass=uppper_attr):	#meata的谷歌翻译即是“元”的意思
    bar = "bip"

print(hasattr(Foo, "bar"))	#输出false
print(hasattr(Foo, "BAR"))	#输出true

零碎

  • hasattr

判断一个类或对象是否有该属性

class T:
    x = 100
print(hasattr(T,"x"))
t = T()
print(hasattr(t,"x"))

元类就是深度的魔法,99%的用户应该根本不必为此操心

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值