import inspect
class BaseMeta(type):
def __init__(cls, name, bases, namespace):
super().__init__(name, bases, namespace)
# check if cls.f is a static method
if not inspect.isfunction(cls.f):
raise Exception("f should be a static method")
# check if cls.g is a static method
if not (inspect.ismethod(cls.g) and cls.g.__self__ == cls):
raise Exception("g should be a class method")
class Base(metaclass=BaseMeta):
@staticmethod
def f():
print("Base.f")
@classmethod
def g(cls):
print("Base.g")
def h(self):
print("Base.h")
class A(Base):
def f():
print("A.f")
class B(Base):
def g(cls):
print("B.g")
aW1wb3J0IGluc3BlY3QKCmNsYXNzIEJhc2VNZXRhKHR5cGUpOgoKICAgIGRlZiBfX2luaXRfXyhjbHMsIG5hbWUsIGJhc2VzLCBuYW1lc3BhY2UpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZSwgYmFzZXMsIG5hbWVzcGFjZSkKICAgICAgICAjIGNoZWNrIGlmIGNscy5mIGlzIGEgc3RhdGljIG1ldGhvZAogICAgICAgIGlmIG5vdCBpbnNwZWN0LmlzZnVuY3Rpb24oY2xzLmYpOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oImYgc2hvdWxkIGJlIGEgc3RhdGljIG1ldGhvZCIpCiAgICAgICAgIyBjaGVjayBpZiBjbHMuZyBpcyBhIHN0YXRpYyBtZXRob2QKICAgICAgICBpZiBub3QgKGluc3BlY3QuaXNtZXRob2QoY2xzLmcpIGFuZCBjbHMuZy5fX3NlbGZfXyA9PSBjbHMpOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oImcgc2hvdWxkIGJlIGEgY2xhc3MgbWV0aG9kIikKCmNsYXNzIEJhc2UobWV0YWNsYXNzPUJhc2VNZXRhKToKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgZigpOgogICAgICAgIHByaW50KCJCYXNlLmYiKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGcoY2xzKToKICAgICAgICBwcmludCgiQmFzZS5nIikKCiAgICBkZWYgaChzZWxmKToKICAgICAgICBwcmludCgiQmFzZS5oIikKCmNsYXNzIEEoQmFzZSk6CgogICAgZGVmIGYoKToKICAgICAgICBwcmludCgiQS5mIikKCmNsYXNzIEIoQmFzZSk6CgogICAgZGVmIGcoY2xzKToKICAgICAgICBwcmludCgiQi5nIik=