python语法

Posted by     "hehaoran" on Friday, October 22, 2021

TOC

魔法方法

  1. 描述符

_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 *时触发

  1. 自定义属性访问方式
  • _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

  1. @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

  1. @abstractmethod、@classmethod、@staticmethod

@abstractmethod为抽象方法只能用于继承,而不能直接实例化;

超类与抽象基类

  1. 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

  1. 抽象基类

有时,我们抽象出一个基类,知道要有哪些方法,但只是抽象方法,并不实现功能,只能继承,而不能被实例化, 但子类必须要实现该方法,这就需要用到抽象基类。

    from abc import ABC
    class MyABC(ABC):
        pass

@abstractmethod 用于程序接口的控制,正如上面的特性,含有@abstractmethod修饰的父类不能实例化,但是继承的子类必须实现@abstractmethod装饰的方法。

其他

  1. 进程和线程

进程是资源分配的最小单位,一个程序至少有一个进程。 线程是程序执行的最小单位,一个进程至少有一个线程。

「真诚赞赏,手留余香」

Haoran Blog

真诚赞赏,手留余香

使用微信扫描二维码完成支付