静态创建类(普通写法)
下面是创建类的常见写法:
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()