TOC
魔法方法
- 描述符
_get_, __set__, __delete__(比如内置的property方法,也是装饰器@property)将某个特殊类型的类的实例指派给另一个类的属性
-
_get_(self, instance, owner): 用于访问属性,返回属性的值
-
_set_(self, instance, value): 将在属性分配操作中被调用,不返回任何内容
-
_delete_(self, instance): 控制删除操作,不返回任何内容
self: 指的是被包装的函数(即这个类装饰器的实例). instance: 代表实例,即另一个类的self. owner: 代表类本身,即另一个类.
https://www.cnblogs.com/JohnABC/p/5685672.html
注:del 是析构器 简单理解为del *时触发
- 自定义属性访问方式
-
_getattr_(self, name) 定义当用户试图获取一个不存在的属性时的行为(只有不存在时才被执行)
-
_getattrbute_(self, name) 定义当该类的属性被访问时的行为(先于__getattr__方法,一定会被执行)
-
_setattr_(self, name, value) 定义当一个属性被访问时的行为
-
_delattr_(self, name) 定义当一个属性被删除时的行为
@property定义的是具体某个实例属性的行为,而__getattribute__等是定义全部实例属性的行为。如果这样的属性比较多时,需要定义一个描述符类。
注:_getattrbute_(self, name)在访问实例属性或调用实例方法时都会触发。
装饰器类
用类写装饰器与函数装饰器的不同在于,前者返回的其实是这个类装饰器的实例,而后者返回的是被装饰后的函数。因此,定义__call__方法可以将类的实例变成可调用对象,实现像函数一样的调用。
在islet.utils.decorators.wrapper_send中加入以下代码
# instance赋值给self.__call__的第一个参数,即func.
# 但是后面又被赋值为被装饰的函数了。加了这句对于这个装饰器没什么影响
def __get__(self, instance, owner):
return partial(self.__call__, instance)
https://zhuanlan.zhihu.com/p/44667584 https://zhuanlan.zhihu.com/p/269012332 https://blog.csdn.net/qq_26406447/article/details/88703492
- @property详解
@property
def public_key(self):
return self._public_key
# property是一个函数装饰器
def property(func):
exec(func.__name__ +'=Property(func)') # 在功能上exec > eval
return eval(func.__name__)
大概的过程是这样的: (1)首先将public_key函数以函数名的方式传给函数装饰器property。 (2)再将public_key以参数的形式传给一个描述符类Property。 (3)通过内置函数exec实例化一个Property对象,并重新赋值给func,即public_key = Property(public_key)。 (4)最后返回这个新func函数给这个类,成为类属性。
因此,那么你在get, set, del这个类属性的时候就会触发 _get_, __set__, __delete__.
https://blog.csdn.net/u012867844/article/details/83782562
- @abstractmethod、@classmethod、@staticmethod
@abstractmethod为抽象方法只能用于继承,而不能直接实例化;
超类与抽象基类
- metaclass
一般地,先定义类,然后创建实例。但是如果我们想创建出类呢?那就必须根据metaclass创建出类,所以:先定义metaclass,然后创建类。
连接起来就是:先定义metaclass,就可以创建类,最后创建实例。
metaclass为超类(元类),定义为实例化后的对象是类
(当我们需要创建一个类时)。主要用于父类对子类的修饰,类似于装饰器;
class CrypTensorMetaclass(type) # -->超类:继承type类
class CrypTensorMetaclass(object) # -->类:继承object类,object是type的一个实例;
# python中一切都是对象,任何类都是type类的实例(type(CrypTensorMetaclass) --> class 'type')
调用type对象来创建class对象:class A: pass -> class =type(classname, superclasses, attributedict)
参考 https://blog.csdn.net/weixin_40009063/article/details/110774165 https://www.jianshu.com/p/7454c02e86c4 https://www.liaoxuefeng.com/wiki/1016959663602400/1017592449371072
- 抽象基类
有时,我们抽象出一个基类,知道要有哪些方法,但只是抽象方法,并不实现功能,只能继承,而不能被实例化, 但子类必须要实现该方法,这就需要用到抽象基类。
from abc import ABC
class MyABC(ABC):
pass
@abstractmethod 用于程序接口的控制,正如上面的特性,含有@abstractmethod修饰的父类不能实例化,但是继承的子类必须实现@abstractmethod装饰的方法。
其他
- 进程和线程
进程是资源分配的最小单位,一个程序至少有一个进程。 线程是程序执行的最小单位,一个进程至少有一个线程。
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付