Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Центр помощи
  • » Реализовать в виде класса набор подпрограмм, для выполнения следующих операций над комплексными числами [RSS Feed]

#1 Июнь 16, 2017 01:11:54

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Реализовать в виде класса набор подпрограмм, для выполнения следующих операций над комплексными числами

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(), сделав там округление, и только при выводе представления (чтобы точность самого числа не терять).



Отредактировано py.user.next (Июнь 16, 2017 01:34:23)

Офлайн

#2 Июнь 16, 2017 06:39:01

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Реализовать в виде класса набор подпрограмм, для выполнения следующих операций над комплексными числами

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 (Июнь 16, 2017 07:05:31)

Офлайн

#3 Июнь 16, 2017 07:03:34

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Реализовать в виде класса набор подпрограмм, для выполнения следующих операций над комплексными числами

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, после которых интерпретатор уходит вглубь сишного кода, где уже нет никаких объектов, но концепция “все есть объект” должна быть соблюдена, поэтому на самом верхнем уровне иерархии классов в питоне создается видимость определенных зависимостей, но это только видимость и декорация.



Офлайн

#4 Июнь 16, 2017 09:02:48

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Реализовать в виде класса набор подпрограмм, для выполнения следующих операций над комплексными числами

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 находится в иерархии классов.



Офлайн

#5 Июнь 16, 2017 09:12:17

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Реализовать в виде класса набор подпрограмм, для выполнения следующих операций над комплексными числами

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



Офлайн

#6 Июнь 16, 2017 10:54:34

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Реализовать в виде класса набор подпрограмм, для выполнения следующих операций над комплексными числами

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



Отредактировано py.user.next (Июнь 16, 2017 10:57:52)

Офлайн

#7 Июнь 16, 2017 11:03:44

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Реализовать в виде класса набор подпрограмм, для выполнения следующих операций над комплексными числами

py.user.next
Сделай стандартными средствами два класса, чтобы они были инстансами друг-друга. Как здесь

  >>> isinstance(type, object)
True
>>> isinstance(object, type)
True



Офлайн

#8 Июнь 16, 2017 11:14:56

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Реализовать в виде класса набор подпрограмм, для выполнения следующих операций над комплексными числами

> Это с чего ты взял?

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

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

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

> Вот только класс - это не экземпляр метакласса, это результат работы фабрики. Это кардинально разные понятия.

 >>> class B(type):
...     pass
...
>>> class C(object):
...     __metaclass__ = B
>>> type(C)
<class '__console__.B'>
Ну хорошо, абстрагируемся от интерпретатора. Согласен ли ты что класс C является экземпляром класса B?



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#9 Июнь 16, 2017 11:20:17

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Реализовать в виде класса набор подпрограмм, для выполнения следующих операций над комплексными числами

 >>> isinstance(type, object)
True
>>> isinstance(object, type)
True
>>> 
>>> issubclass(object, type)
False
>>> issubclass(type, object)
True
....
type просто под object находится в иерархии классов.
Ну ё-маё… Ты разницу между базовам классом и экземпляром понимаешь или как?



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Июнь 16, 2017 12:21:11)

Офлайн

#10 Июнь 16, 2017 11:21:58

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Реализовать в виде класса набор подпрограмм, для выполнения следующих операций над комплексными числами

Rodegast
Согласен ли ты что класс C является экземпляром класса B
Нет, конечно. Он является результатом работы фабрики, реализованной в методе __new__ класса В, которая возвращает значение, полученное стандартной фабрикой type.



Офлайн

  • Начало
  • » Центр помощи
  • » Реализовать в виде класса набор подпрограмм, для выполнения следующих операций над комплексными числами[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version