如何解决类复杂数据描述符或类变量的实数和虚数?
您会知道python中的类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
是类complex
的方法。但是我的疑问是什么是真实的,而imag称为???
在help()中:
>>>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'>
当我们访问类中的类变量时,我们也在访问real和imag。
classname.class_variable (or) objectname.class_variable
因此,我对此表示怀疑。实数和imag是类变量还是数据描述符?
同样,对类start
中的stop
,step
和range
存有疑问。
需要澄清:
预先感谢
解决方法
一个descriptor is a special kind of object in Python,当它作为类变量存储时,通过实例查找它时会在其上运行特殊的方法。
描述符协议用于多种特殊行为,例如方法绑定(如何将self
作为第一个参数传递)。通过property
类型,该协议可轻松用于Python代码。该类型是一个描述符,您可以将其用作方法的装饰器,以便在查找属性时调用该协议(而无需用户显式调用)任何东西)。
在您的情况下,real
类型的imag
和complex
属性(以及range
类型的三个属性)是描述符,但是它们是比其他人少花哨。相反,描述符就是属性访问针对不可变内置类(即,用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
这里real
和imag
是property
对象,它们的描述符类似于内置complex
类型的描述符。它们也是只读的(尽管整个类不是 really 不变的)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。