python动态创建类_python中动态创建类

class Foo(Bar):

pass

Foo中有__metaclass__这个属性吗?如果是,Python会在内存中通过__metaclass__创建一个名字为Foo的类对象(我说的是类对象,请紧跟我的思路)。如果Python没有找到__metaclass__,它会继续在Bar(父类)中寻找__metaclass__属性,并尝试做和前面同样的操作。如果Python在任何父类中都找不到__metaclass__,它就会在模块层次中去寻找__metaclass__,并尝试做同样的操作。如果还是找不到__metaclass__,Python就会用内置的type来创建这个类对象。

类也是对象,在Python中,我们可以动态的创建类 1、在函数内部,需要类时动态创建 2、使用type内建函数 3、使用一个魔法方法metaclass

(一)

函数内部,在分支语句中创建类函数使用

def stu(name):

if name == 'foo':

class Foo:

print('我是Foo...%s'%name)

else:

class XFoo:

print('我是XFoo...我被错误的创建了%s'%name)

stu('foo')

stu(123)

以上就是用于检验引用函数时传入的参数是否合理

(二)

type内建函数

#创建无属性 无继承的类

Foo = type('Foo',(),{})

print(Foo)

#创建有属性 无继承类

Foo = type('Foo',(),{'name':'zhu'})

print(Foo.name)

#创建有属性,有继承类

class Foo:

name = 'zhu'

FooChild = type('FooChild',(Foo,),{'age':19})

print(FooChild.name,FooChild.age)

#创建带方法的类

def select(self):

print(self.name)

class Foo:

name = 'zhu'

FooChild = type('FooChild',(Foo,),{'age':19,'select':select})

print(FooChild.name,FooChild.age,FooChild.select)

fooChild = FooChild()

fooChild.select()

type()参数有三个,第一个是新建的类名,第二个是继承的父类,是一个元组,第三个是类具有的属性和方法,是一个字典,键是属性名或者方法名

(三)

使用魔法方法创建类metaclass

def upper_attr(future_class_name, future_class_parents, future_class_attr):

# 遍历属性字典,把不是__开头的属性名字变为大写

newAttr = {}

for name, value in future_class_attr.items():

if not name.startswith("__"):

newAttr[name.upper()] = value

# 调用type来创建一个类

return type(future_class_name, future_class_parents, newAttr)

class Foo(object, metaclass=upper_attr):

bar = 'bip'

print(hasattr(Foo, 'bar'))

print(hasattr(Foo, 'BAR'))

__mataclass__是为了创建元类而存在,如果类的tree中有,就会调用此方法,如果没有就会使用type方法创建

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值