Форум сайта python.su
857
RodegastТем, что у объекта должны быть только те методы, которые к нему относятся. Ты не можешь добавить числу метод рисования картинки, например, потому что этому методу там делать нечего. Другое дело, если ты создаёшь рисовальщик и ему добавляешь этот метод, который использует число для рисования. Почему сделан отдельный калькулятор? Потому что в него можно добавлять необычные методы по работе с комплексными числами.
Объясни чем по твоему статический метод отличается от метода объекта.
RodegastОно зашито прямо в сишном коде. Для массива определена операция умножения на число. Используется математическая операция умножения вектора на число.
Ну вот и покажи в каком месте оно “зашито”.
AsphaltHeroВ натуральную степень (больше нуля и целая) - по формуле Муавра
Как возвести комплексное число в степень?
Отредактировано py.user.next (Июнь 12, 2017 17:50:13)
Офлайн
186
> Тем, что у объекта должны быть только те методы, которые к нему относятся.
Я тебя не об этом спрашивал. Посему повторяю вопрос: “чем по твоему статический метод отличается от метода объекта”.
> Оно зашито прямо в сишном коде
Т.е. numpy не пользуется никакими “вычислителем”, но тогда как оно умножает вектор на комплексное число?
Офлайн
857
RodegastНестатический метод ты не можешь вынести из объекта, так как он использует внутренности объекта. А статический метод - это функция добавленная в объект, которую можно вынести из него в любой момент. Она добавляется в объект только в целях группировки.
Посему повторяю вопрос: “чем по твоему статический метод отличается от метода объекта”.
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.
>>> 'abc'.maketrans('123', '456') {49: 52, 50: 53, 51: 54} >>>
RodegastДля массива-вектора уножение на число - это обычная операция. Вот ты возьми наш самодельный класс Complex(), как ты его уножишь на список, например? Я его легко умножу на список, просто расширив калькулятор. Но должен ли такой метод входить в само комплексное число? Конечно же нет.
но тогда как оно умножает вектор на комплексное число?
Отредактировано py.user.next (Июнь 13, 2017 02:01:17)
Офлайн
186
> статический метод - это функция добавленная в объект
Неправильно.
> Для массива-вектора уножение на число - это обычная операция … Но должен ли такой метод входить в само комплексное число? Конечно же нет.
Тогда покажи этот “калькулятор” в numpy, если его там нет, то умножение на число является частью объекта numpy.ndarray
Офлайн
568
py.user.nextВо-первых, не в объект, а в класс. Во-вторых она добавляется в класс в целях обеспечения инкапсуляции приватных атрибутов класса.
Она добавляется в объект только в целях группировки.
py.user.nextВсе с точностью до наоборот, нет никаких препятствий вынести метод за пределы объекта. Тебе придется только вручную передавать ссылку на объект, что по сути есть дело вкуса.
Нестатический метод ты не можешь вынести из объекта
Офлайн
186
> Во-вторых она добавляется в класс в целях обеспечения инкапсуляции приватных атрибутов класса.
Это ты про метод класса, ему передаётся ссылка на объект класса первым параметром.
Статический метод это обычная функция находящаяся в пространстве имён класса.
Офлайн
568
Rodegast
Я так понимаю, ваш срач вышел за рамки питона и полемика развернулась вокруг принципов ООП.
Обычно статическим методом в языках программирования называют метод класса. Это вопрос терминологии, но например википедия определяет статический метод именно так
Различают простые методы и статические методы (методы класса)
Офлайн
186
> Я так понимаю, ваш срач вышел за рамки питона
Нет. За рамки мы не выходим.
Отредактировано Rodegast (Июнь 13, 2017 12:31:00)
Офлайн
857
RodegastТак это обычная операция. Numpy - модуль для математической работы с числами и векторами, а для вектора умножение на число - обычная операция, которая вводится чуть ли не первой при определении вектора и операций с ним.
то умножение на число является частью объекта numpy.ndarray
>>> 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'] >>>
>>> 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' >>>
FishHookОт добавления в класс зависит только то, что будет потом в экземпляре класса. Мы же не добавляем в класс просто ради добавления в класс. Мы хотим видеть это в объекте.
Во-первых, не в объект, а в класс. Во-вторых она добавляется в класс в целях обеспечения инкапсуляции приватных атрибутов класса.
FishHookСтатический метод можно вынести из класса и вообще без всякого объекта обходиться. А нестатический - да, требует наличия объекта. А зачем нам объект? Нам объект не нужен. str.maketrans() не использует строку, у которой вызывается, и мог бы быть вообще отдельно в модуле каком-нибудь, но его занесли в класс ради удобства (ради группировки).
Тебе придется только вручную передавать ссылку на объект, что по сути есть дело вкуса.
FishHookСейчас он (ТС) спросит, как по формуле Муавра степень посчитать. А пока он сам пытается это сделать, можно и поговорить. :)
Я так понимаю, ваш срач вышел за рамки питона и полемика развернулась вокруг принципов ООП.
Отредактировано py.user.next (Июнь 14, 2017 00:40:02)
Офлайн
568
py.user.next
Статический метод можно вынести из класса и вообще без всякого объекта обходиться.
# -*- 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()
Офлайн