1.type()
动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的。
比如我们定义一个Person类。
# -*- coding: utf-8 -*-
# @Time : 2022/4/9 15:06
# @File : typedemo.py
# @Software : PyCharm
class Person(object):
def __init__(self, name):
self._name = name
def hello(self):
print('hello,my name is:', self._name)
p = Person('李四')
p.hello()
print(type(Person))
print(type(p))
运行结果:
hello,my name is: 李四
<class 'type'>
<class '__main__.Person'>
type()函数可以查看一个类型或变量的类型,Person是一个class,它的类型就是type,而p是一个实例,它的类型就是class Person。
type()函数既可以返回一个对象的类型,又可以创建出新的类型,比如,我们可以通过type()函数创建出Person类,而无需通过class Hello(object)...的定义。
要创建一个class对象,type()函数依次传入3个参数:
# -*- coding: utf-8 -*-
# @Time : 2022/4/9 15:06
# @File : typedemo.py
# @Software : PyCharm
def say_hello(self): # 先定义函数
print('hello, my name is: %s.' % self._name)
def init(self, name): # 定义构造方法
self._name = name
Person = type('Person', (object,), dict(__init__=init, hello=say_hello)) # 创建Person class
p = Person('张三')
p.hello()
print(type(Person))
print(type(p))
运行结果:
hello, my name is: 张三.
<class 'type'>
<class '__main__.Person'>
2.metaclass
metaclass,直译为元类,我们先定义metaclass,就可以创建类,最后创建实例。
实例:
普通list没有add方法。
ls = [1, 2, 3, 4, 5]
ls.append(100)
# 普通list没有add方法
# ls.add(200)
print(ls)
通过metaclass我们可以自定义一个支持add方法的List。
# -*- coding: utf-8 -*-
# @Time : 2022/4/9 15:25
# @File : metaclass.py
# @Software : PyCharm
# metaclass是类的模板,所以必须从`type`类型派生:
class ListMetaclass(type):
def __new__(cls, name, bases, attrs):
attrs['add'] = lambda self, value: self.append(value)
return type.__new__(cls, name, bases, attrs)
class MyList(list, metaclass=ListMetaclass):
pass
ls = MyList()
ls.add(1)
ls.add(2)
ls.add(3)
ls.add(100)
print(ls)