Python类与对象
本文最后更新于:2023年2月21日 上午
Python类与对象易忘点
目录:
__init()__
方法
注意:两个下划线,类似Java的构造器函数
实例:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
注意:__init()__
方法的第一个参数永远是self
,表示创建的实例本身。
有了__init__
方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__
方法匹配的参数,但self
不需要传,Python解释器自己会把实例变量传进去:
yorick = Student('Yorick',88)
yorick.name
# 'Yorick'
yorick.score
# 88
使用元类,type()
和metaclass
动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的。
type()
type()
函数既可以返回一个对象的类型,又可以创建出新的类型,比如,我们可以通过type()
函数创建出Hello类,而无需通过class Hello(object)...
的定义:
# 先定义类的方法
def fn(self, name='world'):
print('Hello, %s.' % name)
# 创建Hello class
Hello = type('Hello', (object,), dict(hello=fn))
# 创建类的实例
h = Hello()
# 调用实例的方法
h.hello()
# Hello, world.
h.hello('Yorick')
# Hello, Yorick.
metaclass(元类)
先定义metaclass
,就可以创建类,最后创建实例,可以把类看成是metaclass
创建出来的“实例”
实例:
# metaclass是类的模板,所以必须从`type`类型派生:
# 按照习惯,metaclass的类名总是以Metaclass结尾
class ListMetaclass(type):
def __new__(cls, name, bases, attrs):
attrs['add'] = lambda self, value: self.append(value)
return type.__new__(cls, name, bases, attrs)
__new__
方法接收到的参数依次是:
- 当前准备创建的类的对象;
- 类的名字;
- 类继承的父类集合;
- 类的方法集合。
有了ListMetaclass,我们在定义类的时候还要指示使用ListMetaclass来定制类,传入关键字参数metaclass:
# 继承普通list类
class MyList(list, metaclass=ListMetaclass):
pass
测试一下MyList是否可以调用add()方法:
L = MyList()
L.add(1)
L
# [1]
实例:编写ORM
Python类与对象
https://yorick-ryu.github.io/Python/Python类与对象/