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__方法接收到的参数依次是:

  1. 当前准备创建的类的对象;
  2. 类的名字;
  3. 类继承的父类集合;
  4. 类的方法集合。

有了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类与对象/
作者
Yorick
发布于
2022年4月15日
许可协议