Уведомления

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

#1 Июнь 12, 2017 17:47:37

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

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

Rodegast
Объясни чем по твоему статический метод отличается от метода объекта.
Тем, что у объекта должны быть только те методы, которые к нему относятся. Ты не можешь добавить числу метод рисования картинки, например, потому что этому методу там делать нечего. Другое дело, если ты создаёшь рисовальщик и ему добавляешь этот метод, который использует число для рисования. Почему сделан отдельный калькулятор? Потому что в него можно добавлять необычные методы по работе с комплексными числами.

Rodegast
Ну вот и покажи в каком месте оно “зашито”.
Оно зашито прямо в сишном коде. Для массива определена операция умножения на число. Используется математическая операция умножения вектора на число.

AsphaltHero
Как возвести комплексное число в степень?
В натуральную степень (больше нуля и целая) - по формуле Муавра
Нужно сначала комплексное число привести к тригонометрической форме
Формула Муавра (тут надо правильно четверть определять)



Отредактировано py.user.next (Июнь 12, 2017 17:50:13)

Офлайн

#2 Июнь 12, 2017 18:48:15

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

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

> Тем, что у объекта должны быть только те методы, которые к нему относятся.

Я тебя не об этом спрашивал. Посему повторяю вопрос: “чем по твоему статический метод отличается от метода объекта”.

> Оно зашито прямо в сишном коде

Т.е. numpy не пользуется никакими “вычислителем”, но тогда как оно умножает вектор на комплексное число?



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

Офлайн

#3 Июнь 13, 2017 01:58:30

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

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

Rodegast
Посему повторяю вопрос: “чем по твоему статический метод отличается от метода объекта”.
Нестатический метод ты не можешь вынести из объекта, так как он использует внутренности объекта. А статический метод - это функция добавленная в объект, которую можно вынести из него в любой момент. Она добавляется в объект только в целях группировки.

Вот пример
help(str.maketrans)
maketrans(...)
str.maketrans(x[, y[, z]]) -> dict (static method)

Return a translation table usable for str.translate().
If there is only one argument, it must be a dictionary mapping Unicode
ordinals (integers) or characters to Unicode ordinals, strings or None.
Character keys will be then converted to ordinals.
If there are two arguments, they must be strings of equal length, and
in the resulting dictionary, each character in x will be mapped to the
character at the same position in y. If there is a third argument, it
must be a string, whose characters will be mapped to None in the result.
Какое отношение этот метод имеет к строкам? Он никак со строкой не работает вообще, но при этом внесён в класс str.
  
>>> 'abc'.maketrans('123', '456')
{49: 52, 50: 53, 51: 54}
>>>
abc тут никаким боком не используется.

Rodegast
но тогда как оно умножает вектор на комплексное число?
Для массива-вектора уножение на число - это обычная операция. Вот ты возьми наш самодельный класс Complex(), как ты его уножишь на список, например? Я его легко умножу на список, просто расширив калькулятор. Но должен ли такой метод входить в само комплексное число? Конечно же нет.



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

Офлайн

#4 Июнь 13, 2017 11:06:10

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

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

> статический метод - это функция добавленная в объект

Неправильно.

> Для массива-вектора уножение на число - это обычная операция … Но должен ли такой метод входить в само комплексное число? Конечно же нет.

Тогда покажи этот “калькулятор” в numpy, если его там нет, то умножение на число является частью объекта numpy.ndarray



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

Офлайн

#5 Июнь 13, 2017 11:25:21

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

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

py.user.next
Она добавляется в объект только в целях группировки.
Во-первых, не в объект, а в класс. Во-вторых она добавляется в класс в целях обеспечения инкапсуляции приватных атрибутов класса.

py.user.next
Нестатический метод ты не можешь вынести из объекта
Все с точностью до наоборот, нет никаких препятствий вынести метод за пределы объекта. Тебе придется только вручную передавать ссылку на объект, что по сути есть дело вкуса.



Офлайн

#6 Июнь 13, 2017 11:46:20

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

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

> Во-вторых она добавляется в класс в целях обеспечения инкапсуляции приватных атрибутов класса.

Это ты про метод класса, ему передаётся ссылка на объект класса первым параметром.
Статический метод это обычная функция находящаяся в пространстве имён класса.



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

Офлайн

#7 Июнь 13, 2017 12:05:58

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

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

Rodegast
Я так понимаю, ваш срач вышел за рамки питона и полемика развернулась вокруг принципов ООП.
Обычно статическим методом в языках программирования называют метод класса. Это вопрос терминологии, но например википедия определяет статический метод именно так

Различают простые методы и статические методы (методы класса)



Офлайн

#8 Июнь 13, 2017 12:20:48

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

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

> Я так понимаю, ваш срач вышел за рамки питона

Нет. За рамки мы не выходим.



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

Отредактировано Rodegast (Июнь 13, 2017 12:31:00)

Офлайн

#9 Июнь 14, 2017 00:36:28

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

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

Rodegast
то умножение на число является частью объекта numpy.ndarray
Так это обычная операция. Numpy - модуль для математической работы с числами и векторами, а для вектора умножение на число - обычная операция, которая вводится чуть ли не первой при определении вектора и операций с ним.
Но вот для комплесного числа умножение на вектор - не обычная операция, а специфическая, поэтому она выносится в калькулятор, которых может быть множество. Одни калькуляторы могут одно считать, другие - другое. Ты даже можешь ввести калькулятор над каким-нибудь полем и считать через него только в пределах этого поля. Там и операции соответствующие. Но зачем загонять все эти разновидности вычислений в одно классическое комплексное число?

Вот смотри
  
>>> c = 1+2j
>>> dir(c)
['__abs__', '__add__', '__bool__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__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']
>>>
Видишь, какие операции определены?
+
-
*
/
abs() - модуль
pow() - степень
А где нибудь видишь ужножение на список?

  
>>> c * [1, 2, 3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'complex'
>>> 

Вот я в калькулятор спокойно могу добавить такое умножение (по аналогии с вектором в numpy), но в самом комплексном числе такой операции делать нечего. Поэтому они и разделены. Он же сегодня говорит, что ему нужны стандартные операции над комплексными числами, а завтра ему препод скажет “давай ещё какие-нибудь” и придётся делать этот калькулятор всё равно. В питоне же для этого даже отдельный модуль есть - cmath. Ты спрашивал, где в питоне калькулятор, вот в этом cmath'е этот калькулятор, весь cmath - это такой один большой калькулятор. И то там не всё есть, что можно делать. Но для этого и делают отдельные сторонние модули со всеми подробностями.

FishHook
Во-первых, не в объект, а в класс. Во-вторых она добавляется в класс в целях обеспечения инкапсуляции приватных атрибутов класса.
От добавления в класс зависит только то, что будет потом в экземпляре класса. Мы же не добавляем в класс просто ради добавления в класс. Мы хотим видеть это в объекте.

FishHook
Тебе придется только вручную передавать ссылку на объект, что по сути есть дело вкуса.
Статический метод можно вынести из класса и вообще без всякого объекта обходиться. А нестатический - да, требует наличия объекта. А зачем нам объект? Нам объект не нужен. str.maketrans() не использует строку, у которой вызывается, и мог бы быть вообще отдельно в модуле каком-нибудь, но его занесли в класс ради удобства (ради группировки).

FishHook
Я так понимаю, ваш срач вышел за рамки питона и полемика развернулась вокруг принципов ООП.
Сейчас он (ТС) спросит, как по формуле Муавра степень посчитать. А пока он сам пытается это сделать, можно и поговорить. :)



Отредактировано py.user.next (Июнь 14, 2017 00:40:02)

Офлайн

#10 Июнь 14, 2017 06:08:10

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

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

py.user.next
Статический метод можно вынести из класса и вообще без всякого объекта обходиться.

Ты перманентно путаешь понятия класс и объект.
Вообще любую программу можно написать на глобальных переменных и функциях. Но мы говорим об ООП и best practices.

 # -*- coding:utf-8 -*-
settings = {"db_kind": "RDBMS"}  # config
    
class RDBMSProvider:
    pass
    
class KeyValueProvider:
    pass
    
class Meta(type):
    
    def __new__(cls, name, base, dct):
        if settings["db_kind"] == "RDBMS":
            dct["_provider"] = RDBMSProvider()
        else:
            dct["_provider"] = KeyValueProvider()
    
        # cls._provider - protected attribute
   
        return super(Meta, cls).__new__(cls, name, base, dct)
    
class BaseDataAdapter(object):
    __metaclass__ = Meta
    
    @classmethod
    def get_db_kind(cls):
        return cls._provider.__class__.__name__
    
class DataAdapter(BaseDataAdapter):
    pass
    
print DataAdapter.get_db_kind()

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



Офлайн

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

Board footer

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

Powered by DjangoBB

Lo-Fi Version