Python type创建类

静态创建类(普通写法)

下面是创建类的常见写法:

class ObjectCreator(object):
    pass
my_object = ObjectCreator()
print(my_object) # <__main__.ObjectCreator object at 0x000001A2B163B630>

注意这个类也是一个对象,而这个类对象还可以创建实例对象.也既是说class的本质也是一个object.所以我们可以对class来进行object的操作:

print(hasattr(ObjectCreator, 'new_attribute')) # 可以查看属性
ObjectCreator.new_attribute = 'foo' # 可以添加属性
print(hasattr(ObjectCreator, 'new_attribute')) # 可以查看属性
print(ObjectCreator.new_attribute) # 获得属性

动态创建类(函数写法)

定义choose_class方法,根据参数的名称(字符串),来创建类

def choose_class(name):
    if name == 'foo':
        class Foo(object):
            pass
        return Foo     # 返回的是类,不是类的实例
    else:
        class Bar(object):
            pass
        return Bar
Foo = choose_class('foo')
print(Foo) # <class '__main__.choose_class.<locals>.Foo'>类
print(Foo()) # <__main__.choose_class.<locals>.Foo object at 0x000001A2B163B6D8> 实例

动态创建类(type)

虽然通过函数,我们可以使用字符串来创建类,但是这样还不够智能,我们要写很多代码,python提供了创建类的方法type

type(name, bases, attrs)
name: (str)class的名称
bases: (tuple)基类,可以为空
attrs: class的属性和值

例如:
1.创建类

class MyShinyClass(object):
      pass

等价于

MyShinyClass = type('MyShinyClass', (), {}) # returns a class object

2.给类添加属性

class Foo(object):
      bar = True

等价于

Foo = type('Foo', (), {'bar':True})

3.给类添加方法

class Foo(object):
      bar = True
      def echo():
      	print("hello")

等价于

def echo():
	print("hello")
Foo = type('Foo', (), {'echo':echo})

4.继承

class FooChild(Foo):
	pass

等价于

FooChild = type('FooChild', (Foo,), {})
# 1.
# 一般创建类的方法
class Foo(object):
    pass
obj = Foo()  # 本质上调用了__call__,然后__call__调用了__new__和__init__

# 一切皆对象,类由type创建类,然后传入参数创建对象
class Foo(object):  # 创建类方法1
    pass
Foo = type('Foo',(object,),{})  # 创建类的方法2,类是由type创建的

# 2.
# 一切皆对象,类由MyType创建
class MyType(type):
    pass
Foo = MyType('Foo',(object,),{}) # 由mytype创建

class Foo(object,metaclass=MyType): # 由mytype创建
    pass

# 3.
# 一切皆对象,类由MyType创建
class MyType(type):
    def __init__(self, *args, **kwargs):
        super(MyType, self).__init__(*args, **kwargs)

    def __call__(cls, *args, **kwargs):
        return super(MyType, cls).__call__(*args, **kwargs)

Foo = MyType('Foo',(object,),{})


class Foo(object,metaclass=MyType):
    pass

Foo()
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值