我正在编写一个装饰(为了好奇),在python中创建一个类摘要.到目前为止看起来它会起作用,但我有一个意想不到的行为.
装饰的想法如下:
from abc import ABCMeta, abstractmethod
def abstract(cls):
cls.__metaclass__ = ABCMeta
return cls
Run Code Online (Sandbox Code Playgroud)
然后,当使用这种装饰时,只需要定义一个抽象方法
@abstract
class Dog(object):
@abstractmethod
def bark(self):
pass
Run Code Online (Sandbox Code Playgroud)
但是当我测试时,我能够实例化一个Dog对象:
d = Dog()
d.bark() //no errors
Dog.__metaclass__ //returned "<class 'abc.ABCMeta'>"
Run Code Online (Sandbox Code Playgroud)
在__metaclass__直接测试分配时,它的行为符合预期:
class Dog(object):
__metaclass__ = ABCMeta
@abstractmethod
def bark(self):
pass
Run Code Online (Sandbox Code Playgroud)
测试:
d = Dog()
"Traceback (most recent call last):
File "<pyshell#98>", line 1, in <module>
d = Dog()
TypeError: Can't instantiate abstract class Dog with abstract methods bark"
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
假设我有不同的类来处理同一协议的不同版本(可能具有不同的接口)。例如,一个名为“我的协议”(MYP)的虚拟协议:
我的协议(MYP)版本1.0、1.1、2.0、2.2等...
我可以想到的一些命名示例是:
MYP10Handler,MYP11Handler,MYP20Handler,MYP22Handler,...
MYP1_0Handler,MYP1_1Handler,MYP2_0Handler,MYP2_2Handler,...
例如,如果使用第一个选项,则协议达到更高版本时将存在歧义。例如,版本11.0(十一):
MYP11Handler:版本1.1或11.0?
MYP110Handler:版本11.0或1.10?
然而,第二种选择似乎逃避了骆驼案规则。
通常如何对这些类型的类进行命名?有更好的做法吗?