class 复杂数据描述符或 class 变量的真实和想象?

real and imag of class complex data descriptors or class variables?

您会在 python 中注意到 class complex。它包含:

>>> dir(complex)
Output :
['__abs__', '__add__', '__bool__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__int__', '__le__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__pos__', '__pow__', '__radd__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rmod__', '__rmul__', '__rpow__', '__rsub__', '__rtruediv__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', 'conjugate', 'imag', 'real']

这里conjugate是classcomplex的一个方法。但我的疑问是什么是真实的和想象的??

在帮助中():

>>>help(complex)
Output:
class complex(object)
 |  complex(real=0, imag=0)
...
...
...
 ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |  
 |  imag
 |      the imaginary part of a complex number
 |  
 |  real
 |      the real part of a complex number

在 help() 中,real 和 imag 作为数据描述符给出。

在 type() 中的位置:

>>> a=1j
>>> type(a.real)
<class 'float'>
>>> type(a.imag)
<class 'float'>

当我们访问 class 中的 class 变量时,我们也正在访问 real 和 imag。

classname.class_variable (or) objectname.class_variable

因此,我在这里产生了疑问。 real 和 imag 是一种class变量还是数据描述符??? 同样,startstopstep中的疑问classrange.

需要澄清:

  1. 它们是数据描述符还是一种class变量??

  2. 如果是数据描述符,请解释为什么叫数据描述符???

  3. 任何与我的疑问相关的数据描述符的参考链接都非常需要

提前致谢

一个 descriptor is a special kind of object in Python,当它存储为 class 变量时,当它通过实例查找时,它会得到特殊的方法 运行。

描述符协议用于几种特殊行为,例如方法绑定(self 如何作为第一个参数传递)。该协议可以通过 property 类型轻松用于 Python 代码,这是一个描述符,您可以将其作为装饰器应用于方法,以便在查找属性时调用它(不需要用户明确调用任何东西)。

在你的例子中,complex 类型的 realimag 属性(以及 range 类型的三个属性)是描述符,但是他们没有其他人那么花哨。相反,描述符只是属性访问如何用于不可变内置 classes 实例(即,用 C 实现的实例,而不是纯 Python)。 complex(或range)对象的实际数据存储在 C 结构中。描述符允许它被 Python 代码访问。请注意,您不能分配给这些属性,因为那样会破坏对象的不变性。

您可以使用 property:

实现类似的类型
class MyComplex():
    def __init__(self, real=0, imag=0):
        self._real = real
        self._imag = imag

    @property
    def real(self):
        return self._real

    @property
    def imag(self):
        return self._imag

这里的realimagproperty对象,是类似于内置complex类型的描述符。它们也是只读的(尽管 class 作为一个整体并不是 真的 不可变的)。