[Python-ideas] Fwd: Define a method or function attribute outside of a class with the dot operator
Steve Dower
steve.dower at python.org
Fri Feb 10 15:42:54 EST 2017
On 10Feb2017 1400, Stephan Hoyer wrote:
> An important note is that ideally, we would still have way of indicating
> that Spam.func should exists in on the Spam class itself, even if it
> doesn't define the implementation. I suppose an abstractmethod
> overwritten by the later definition might do the trick, e.g.,
>
> class Spam(metaclass=ABCMeta):
> @abstractmethod
> def func(self):
> pass
>
> def Spam.func(self):
> return __class__
An abstractfunction should not become a concrete function on the
abstract class - the right way to do this is to use a subclass.
class SpamBase(metaclass=ABCMeta):
@abstractmethod
def func(self):
pass
class Spam(SpamBase):
def func(self):
return __class__
If you want to define parts of the class in separate modules, use mixins:
from myarray.transforms import MyArrayTransformMixin
from myarray.arithmetic import MyArrayArithmeticMixin
from myarray.constructors import MyArrayConstructorsMixin
class MyArray(MyArrayConstructorsMixin, MyArrayArithmeticMixin,
MyArrayTransformMixin):
pass
The big different between these approaches and the proposal is that the
proposal does not require both parties to agree on the approach. This is
actually a terrible idea, as subclassing or mixing in a class that
wasn't meant for it leads to all sorts of trouble unless the end user is
very careful. Providing first-class syntax or methods for this
discourages carefulness. (Another way of saying it is that directly
overriding class members should feel a bit dirty because it *is* a bit
dirty.)
As Paul said in an earlier email, the best use of non-direct assignment
in function definitions is putting it into a dispatch dictionary, and in
this case making a decorator is likely cleaner than adding new syntax.
But by all means, let's have a PEP. It will simplify the discussion when
it comes up in six months again (or whenever the last time this came up
was - less than a year, I'm sure).
Cheers,
Steve
More information about the Python-ideas
mailing list