Найти - Пользователи
Полная версия: Реализовать в виде класса набор подпрограмм, для выполнения следующих операций над комплексными числами
Начало » Центр помощи » Реализовать в виде класса набор подпрограмм, для выполнения следующих операций над комплексными числами
1 2 3 4 5 6
py.user.next
FishHook
И пример есть?
Внезапно и незамысловато
  
>>> class A:
...   pass
... 
>>> type(A)
<class 'type'>
>>> type
<class 'type'>
>>> isinstance(A, type)
True
>>> A.__class__
<class 'type'>
>>>
https://docs.python.org/3/library/stdtypes.html#type-objects


Rodegast
Ты получаешь говнокод.
Это с чего ты взял? Я бы посмотрел, как ты, имея одну операцию над комплексными числами, делал бы дополнительно другую такую же операцию, немного отличающуюся от этой. Вот куда бы ты её засунул, если в самом числе помещается только одна? Вот ты бы засунул её в число под именем, а потом бы отличить их не мог друг от друга. Я просто это представляю, потому что видал такое. Другое дело, когда у тебя целый калькулятор специальный есть для таких других операций, в нём не запутаешься.

Rodegast
Класс это экземпляр метакласса.
Метакласс - это просто красивое название для класса. Нет никаких метаклассов, это просто название. Как устроен класс - неизвестно, так как это чёрный ящик. Поэтому различия между int и float будут такие же как и различия между класс и метакласс.


AsphaltHero
Доведите до ума пожалуйста функцию pow? Результат не очень выдает.
Поправил только синтаксис (для питона многое не принято делать синтаксически).
  
>>> import math
>>> 
>>> class Complex:
...     def __init__(self, real, imag):
...         self.real = real
...         self.imag = imag
...     def __str__(self):
...         sign = '+' if self.imag >= 0 else ''
...         return '{}{}{}i'.format(self.real, sign, self.imag)
...     __repr__ = __str__
... 
>>> class ComplexCalc:
...     @staticmethod
...     def add(c1, c2):
...         real = c1.real + c2.real
...         imag = c1.imag + c2.imag
...         return Complex(real, imag)
...     @staticmethod
...     def sub(c1, c2):
...         real = c1.real - c2.real
...         imag = c1.imag - c2.imag
...         return Complex(real, imag)
...     @staticmethod
...     def mul(c1, c2):
...         real = c1.real * c2.real - c1.imag * c2.imag
...         imag = c1.imag * c2.real + c1.real * c2.imag
...         return Complex(real, imag)
...     @staticmethod
...     def abs(c):
...         return (c.real ** 2 + c.imag ** 2) ** 0.5
...     @staticmethod
...     def pow(c, n):
...         if n < 1 or int(n) != n:
...             raise ValueError(
...                 'power should be natural (integer from 1 to +inf): '
...                 + str(n))
...         phi = math.atan2(c.imag, c.real)
...         r = (c.real ** 2 + c.imag ** 2) ** 0.5
...         rpn = r ** n
...         nphi = n * phi
...         real = rpn * math.cos(nphi)
...         imag = rpn * math.sin(nphi)
...         return Complex(real, imag)
... 
>>> calc = ComplexCalc()
>>> calc.add(Complex(1, 2), Complex(3, 4))
4+6i
>>> calc.sub(Complex(1, 2), Complex(3, 4))
-2-2i
>>> calc.mul(Complex(1, 2), Complex(3, 4))
-5+10i
>>> calc.abs(Complex(3, 4))
5.0
>>> calc.pow(Complex(1, 2), 10)
236.99999999999716-3116.000000000002i
>>>
То, что оно длинные дроби выдаёт, это можно поменять внутри класса Complex(), сделав там округление, и только при выводе представления (чтобы точность самого числа не терять).
FishHook
Rodegast
P.S. Метакласс это type и его наследники. Конечно-же функция не может быть метаклассом. Просто значением атрибута __metaclass__ должен быть объект который при вызове вернёт класс. Будет этим объектом функция или непосредственно метакласс не суть важно.
Несомненно, что фабрика классов одна и эта фабрика глубоко корнями уходит в глубь реализации интерпретатора. Вот только класс - это не экземпляр метакласса, это результат работы фабрики. Это кардинально разные понятия.
В том, что классы - это не экземпляры type (хотя выглядят они как экземпляры, базара нет) легко убедиться, если выяснить, что метод __new__ (который собственно и создает класс как объект) - статический.
 print type.__new__(type, "A", (), {})

и сигнатура его известна
     @staticmethod # known case of __new__
    def __new__(S, *more): # real signature unknown; restored from __doc__
        """ T.__new__(S, ...) -> a new object with type S, a subtype of T """
        pass

То есть это фабрика, которая создает объекты определенного типа. То что названия фабрики и типа совпадают, это декорация. Фабрику можно было бы юзать явно, если бы она была доступна. Но язык спроектировали так, что доступна она только через вызов type, что не делает классы инстансами type.
А недоступна она потому что сама не является объектом, что нарушает концепцию “все есть объект”
FishHook
py.user.next
Внезапно и незамысловато
 >>> isinstance(type, object)
True
>>> isinstance(object, type)
True
>>> type(type)
<type 'type'>
>>> type(object)
<type 'type'>
>>>
>>> object.__subclasses__()
[<type 'type'>,...]

По твоей логике получается, что type - это экземпляр type, при этом он отнаследован от object, который в свою очередь является экземпляром type.

Есть границы применимости type и isinstance, после которых интерпретатор уходит вглубь сишного кода, где уже нет никаких объектов, но концепция “все есть объект” должна быть соблюдена, поэтому на самом верхнем уровне иерархии классов в питоне создается видимость определенных зависимостей, но это только видимость и декорация.
py.user.next
FishHook
  
>>> type(type)
<type 'type'>
>>>
Опять ты где-то в старье смотришь.

Вот питон 3.3.2
  
>>> type(type)
<class 'type'>
>>> 
>>> isinstance(type, object)
True
>>> isinstance(object, type)
True
>>> 
>>> issubclass(object, type)
False
>>> issubclass(type, object)
True
>>> type.__class__
<class 'type'>
>>> issubclass(type.__class__, object)
True
>>>
>>> issubclass(1, object)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: issubclass() arg 1 must be a class
>>>

type просто под object находится в иерархии классов.
FishHook
py.user.next
type просто под object находится в иерархии классов.
Формально. Ровно как и наоборот. Это тупо формальность.
 >>> isinstance(type, object)
True
>>> isinstance(object, type)
True

py.user.next
  
>>> issubclass(int, type)
False
>>> issubclass(int, object)
True
>>>
>>> isinstance(1, object)
True
>>> isinstance(1, type)
False
>>>

  
>>> class A: pass
... 
>>> a = A()
>>> 
>>> isinstance(a, object)
True
>>> isinstance(a, type)
False
>>> isinstance(A, type)
True
>>>
>>> isinstance(int, type)
True
>>> isinstance(1, type)
False
>>>
FishHook
py.user.next
Сделай стандартными средствами два класса, чтобы они были инстансами друг-друга. Как здесь

  >>> isinstance(type, object)
True
>>> isinstance(object, type)
True
Rodegast
> Это с чего ты взял?

См. мои сообщения выше относительно инкапсуляции и перегрузке операторов.

> Метакласс - это просто красивое название для класса.

Иди на OZON и купи каких нибудь умных книжек по Python-у. Как их прочитаешь, так и умничай, а то ты даже основы объектной модели не знаешь.

> Вот только класс - это не экземпляр метакласса, это результат работы фабрики. Это кардинально разные понятия.
 >>> class B(type):
...     pass
...
>>> class C(object):
...     __metaclass__ = B
>>> type(C)
<class '__console__.B'>
Ну хорошо, абстрагируемся от интерпретатора. Согласен ли ты что класс C является экземпляром класса B?
Rodegast
 >>> isinstance(type, object)
True
>>> isinstance(object, type)
True
>>> 
>>> issubclass(object, type)
False
>>> issubclass(type, object)
True
....
type просто под object находится в иерархии классов.
Ну ё-маё… Ты разницу между базовам классом и экземпляром понимаешь или как?
FishHook
Rodegast
Согласен ли ты что класс C является экземпляром класса B
Нет, конечно. Он является результатом работы фабрики, реализованной в методе __new__ класса В, которая возвращает значение, полученное стандартной фабрикой type.

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB