美文网首页
Python35_元类

Python35_元类

作者: jxvl假装 | 来源:发表于2019-09-27 12:31 被阅读0次

类也是对象

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%的用户应该根本不必为此操心

相关文章

  • Python35_元类

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

  • 3.isa

    isa指向 ->实例isa -> 类|类isa -> 元类 | 元类isa -> 根元类|根元类isa -> 根元...

  • Python元类

    元类 元类就是用来创建类的,元类就是类的类。 实例 关于type()函数的使用戳这里 元类为一个函数 元类为一个类

  • isa 和 superclass

    实例对象的 isa 指向类对象,类对象的 isa 指向元类对象,元类的isa 指向基类的元类对象,基类的元类对象的...

  • 友元类和嵌套类

    友元类 友元函数用于类的扩展接口中,类并非只能拥有友元函数,也可以将类作为友元,该类称为友元类。 友元类的所有方法...

  • 29.Python之面向对象的元类

    Python之面向对象的元类 什么是元类?类的类就是元类,元类创建对象。使用class定义的类,用来产生程序员自己...

  • 面向对象 六

    目录 1.元类 1.1 类创建过程 1.2 元类控制类的创建 1.3 元类控制类的创建过程案例 1.4 自定义元...

  • Python 元类

    什么是元类?元类就是创建类的类,type是最原始的一个元类。(实例是实例化的类,而类是元类的实例)python中一...

  • isa

    NSObject的父类为nil NSObject的isa为根元类 元类的isa都为根元类 根元类的isa为本身 根...

  • iOS开发中方法查找流程图

    实例对象的isa指针指向类对象,类对象的isa指针指向元类,元类的isa指针指向根元类,根元类的isa指针指向自己...

网友评论

      本文标题:Python35_元类

      本文链接:https://www.haomeiwen.com/subject/cuhuuctx.html