Форум сайта python.su
857
FishHookВнезапно и незамысловато
И пример есть?
>>> class A: ... pass ... >>> type(A) <class 'type'> >>> type <class 'type'> >>> isinstance(A, type) True >>> A.__class__ <class 'type'> >>>
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 >>>
Отредактировано py.user.next (Июнь 16, 2017 01:34:23)
Офлайн
568
RodegastНесомненно, что фабрика классов одна и эта фабрика глубоко корнями уходит в глубь реализации интерпретатора. Вот только класс - это не экземпляр метакласса, это результат работы фабрики. Это кардинально разные понятия.
P.S. Метакласс это type и его наследники. Конечно-же функция не может быть метаклассом. Просто значением атрибута __metaclass__ должен быть объект который при вызове вернёт класс. Будет этим объектом функция или непосредственно метакласс не суть важно.
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
Отредактировано FishHook (Июнь 16, 2017 07:05:31)
Офлайн
568
py.user.next
Внезапно и незамысловато
>>> isinstance(type, object) True >>> isinstance(object, type) True >>> type(type) <type 'type'> >>> type(object) <type 'type'> >>> >>> object.__subclasses__() [<type 'type'>,...]
Офлайн
857
FishHookОпять ты где-то в старье смотришь.>>> type(type) <type 'type'> >>>
>>> 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 >>>
Офлайн
568
py.user.nextФормально. Ровно как и наоборот. Это тупо формальность.
type просто под object находится в иерархии классов.
>>> isinstance(type, object) True >>> isinstance(object, type) True
Офлайн
857
>>> 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)
Офлайн
568
py.user.next
Сделай стандартными средствами два класса, чтобы они были инстансами друг-друга. Как здесь
>>> isinstance(type, object) True >>> isinstance(object, type) True
Офлайн
186
> Это с чего ты взял?
См. мои сообщения выше относительно инкапсуляции и перегрузке операторов.
> Метакласс - это просто красивое название для класса.
Иди на OZON и купи каких нибудь умных книжек по Python-у. Как их прочитаешь, так и умничай, а то ты даже основы объектной модели не знаешь.
> Вот только класс - это не экземпляр метакласса, это результат работы фабрики. Это кардинально разные понятия.
>>> class B(type): ... pass ... >>> class C(object): ... __metaclass__ = B >>> type(C) <class '__console__.B'>
Офлайн
186
Ну ё-маё… Ты разницу между базовам классом и экземпляром понимаешь или как?type просто под object находится в иерархии классов.>>> isinstance(type, object) True >>> isinstance(object, type) True >>> >>> issubclass(object, type) False >>> issubclass(type, object) True ....
Отредактировано Rodegast (Июнь 16, 2017 12:21:11)
Офлайн
568
RodegastНет, конечно. Он является результатом работы фабрики, реализованной в методе __new__ класса В, которая возвращает значение, полученное стандартной фабрикой type.
Согласен ли ты что класс C является экземпляром класса B
Офлайн