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变量还是数据描述符???
同样,start
、stop
和step
中的疑问classrange
.
需要澄清:
它们是数据描述符还是一种class变量??
如果是数据描述符,请解释为什么叫数据描述符???
任何与我的疑问相关的数据描述符的参考链接都非常需要
提前致谢
一个 descriptor is a special kind of object in Python,当它存储为 class 变量时,当它通过实例查找时,它会得到特殊的方法 运行。
描述符协议用于几种特殊行为,例如方法绑定(self
如何作为第一个参数传递)。该协议可以通过 property
类型轻松用于 Python 代码,这是一个描述符,您可以将其作为装饰器应用于方法,以便在查找属性时调用它(不需要用户明确调用任何东西)。
在你的例子中,complex
类型的 real
和 imag
属性(以及 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
这里的real
和imag
是property
对象,是类似于内置complex
类型的描述符。它们也是只读的(尽管 class 作为一个整体并不是 真的 不可变的)。
您会在 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变量还是数据描述符???
同样,start
、stop
和step
中的疑问classrange
.
需要澄清:
它们是数据描述符还是一种class变量??
如果是数据描述符,请解释为什么叫数据描述符???
任何与我的疑问相关的数据描述符的参考链接都非常需要
提前致谢
一个 descriptor is a special kind of object in Python,当它存储为 class 变量时,当它通过实例查找时,它会得到特殊的方法 运行。
描述符协议用于几种特殊行为,例如方法绑定(self
如何作为第一个参数传递)。该协议可以通过 property
类型轻松用于 Python 代码,这是一个描述符,您可以将其作为装饰器应用于方法,以便在查找属性时调用它(不需要用户明确调用任何东西)。
在你的例子中,complex
类型的 real
和 imag
属性(以及 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
这里的real
和imag
是property
对象,是类似于内置complex
类型的描述符。它们也是只读的(尽管 class 作为一个整体并不是 真的 不可变的)。