реальные и отображаемые дескрипторы данных класса complex или переменные класса?

#python #class #complex-numbers

#python #класс #комплексные числа

Вопрос:

Вы бы знали о классе complex в python. Он содержит :

 >>> 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 . Но я сомневаюсь, что здесь называются real и imag как ??

В справке():

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

Следовательно, у меня здесь есть сомнения. Являются ли real и imag своего рода переменными класса или дескрипторами данных???
Аналогично, сомнение в start stop и step в классе range .

Требуется разъяснение для :

  1. Являются ли они дескрипторами данных или своего рода переменными класса??

  2. Если они являются дескрипторами данных, пожалуйста, объясните мне, почему они называются дескрипторами данных???

  3. Очень нужны любые справочные ссылки, касающиеся дескрипторов данных, связанных с моими сомнениями

Заранее спасибо

Комментарии:

1. real и imag являются атрибутами комплексных чисел только для чтения. Вы можете использовать их для получения действительной и мнимой частей комплексного числа. Больше ничего не нужно.

Ответ №1:

Дескриптор — это особый вид объекта в Python, который, когда он хранится как переменная класса, запускает специальные методы, когда он просматривается через экземпляр.

Протокол дескриптора используется для нескольких видов специального поведения, таких как привязка метода (как self передается в качестве первого аргумента). Протокол легко доступен для кода Python через property тип, который является дескриптором, который вы можете применить в качестве декоратора к методу, чтобы он вызывался при поиске атрибута (без необходимости явного вызова пользователем чего-либо).

В вашем случае атрибуты 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 типе. Они также доступны только для чтения (хотя класс в целом на самом деле не является неизменяемым).