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