Quantcast
Viewing all articles
Browse latest Browse all 6

Answer by Lennart Regebro for `staticmethod` and `abc.abstractmethod`: Will it blend?

This will do it:

>>> import abc>>> abstractstaticmethod = abc.abstractmethod>>>>>> class A(object):  ...     __metaclass__ = abc.ABCMeta  ...     @abstractstaticmethod  ...     def themethod():  ...          pass  ... >>> a = A()>>> Traceback (most recent call last):  File "asm.py", line 16, in <module>    a = A()  TypeError: Can't instantiate abstract class A with abstract methods test

You go "Eh? It just renames @abstractmethod", and this is completely correct. Because any subclass of the above will have to include the @staticmethod decorator anyway. You have no need of it here, except as documentation when reading the code. A subclass would have to look like this:

>>> class B(A):  ...     @staticmethod  ...     def themethod():  ...         print "Do whatevs"

To have a function that would enforce you to make this method a static method you would have to subclass ABCmeta to check for that and enforce it. That's a lot of work for no real return. (If somebody forgets the @staticmethod decorator they will get a clear error anyway, it just won't mention static methods.

So in fact this works just as well:

>>> import abc>>>>>> class A(object):  ...     __metaclass__ = abc.ABCMeta  ...     @abc.abstractmethod  ...     def themethod():  ...         """Subclasses must implement this as a @staticmethod"""  ...          pass

Update - Another way to explain it:

That a method is static controls how it is called.An abstract method is never called.And abstract static method is therefore a pretty pointless concept, except for documentation purposes.


Viewing all articles
Browse latest Browse all 6

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>