小编Hyd*_*ren的帖子

Python抽象装饰不工作

我正在编写一个装饰(为了好奇),在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)

为什么会这样?

python abstract-class

7
推荐指数
1
解决办法
275
查看次数

名称中带有版本的类的Java命名约定?

假设我有不同的类来处理同一协议的不同版本(可能具有不同的接口)。例如,一个名为“我的协议”(MYP)的虚拟协议:

我的协议(MYP)版本1.0、1.1、2.0、2.2等...

我可以想到的一些命名示例是:

MYP10HandlerMYP11HandlerMYP20HandlerMYP22Handler,...

MYP1_0HandlerMYP1_1HandlerMYP2_0HandlerMYP2_2Handler,...

例如,如果使用第一个选项,则协议达到更高版本时将存在歧义。例如,版本11.0(十一):

MYP11Handler:版本1.1或11.0?

MYP110Handler:版本11.0或1.10?

然而,第二种选择似乎逃避了骆驼案规则。

通常如何对这些类型的类进行命名?有更好的做法吗?

java convention naming version

1
推荐指数
1
解决办法
3883
查看次数

标签 统计

abstract-class ×1

convention ×1

java ×1

naming ×1

python ×1

version ×1