Python 在具有元类的类上键入函数

Python 在具有元类的类上键入函数,python,metaclass,Python,Metaclass,我想要的是: class ParamMeta(type): def __str__(self): return self.__name__ class Param(object): __metaclass__=ParamMeta class SomeParam(Param): pass 我如何做到这一点 更新:我需要更改什么才能获得所需的行为 更新2:为了子孙后代:这个问题完全是假的。请假装你没看见;) SomeParam类对象的类型不是Param,而是paramet

我想要的是:

class ParamMeta(type):
  def __str__(self):
    return self.__name__


class Param(object):
  __metaclass__=ParamMeta

class SomeParam(Param):
  pass
我如何做到这一点

更新:我需要更改什么才能获得所需的行为


更新2:为了子孙后代:这个问题完全是假的。请假装你没看见;)

SomeParam类对象的类型不是
Param
,而是
parameta
,并且
type()
正确地报告了这一点。您混淆了is-a和继承关系。
SomeParam
实例是-A
Param
。另一方面,
SomeParam
类对象继承自
Param
类对象,但它不是
Param
类型的值

对于子类关系,有内置的
issubclass()
,它类似于is-a关系的
isinstance
issubclass(SomeParam,Param)
为true


编辑:您无法实现
type(SomeParam)
返回
Param
,当然除了使用手动编写的返回基类的函数来隐藏名称
type
(这将是非常误导和糟糕的样式)。

您想用它实现什么,您的用例是什么?为什么
type(SomeParam)
需要作为基类,而不是
parameta
元类型?如果有多个基类会发生什么?不,这不是用例。这不是颠覆Python类和类型系统的原因。最重要的是,这根本不是原因。不,
SomeParam
不是
Param
类型。你刚才证实了我的怀疑,这个问题是基于一个很大的误解。再读一遍我的答案。我试图纠正这种误解。@jldupont:没有办法强制执行
类型
函数。我们希望你告诉我们你想解决什么问题;可能没有必要一次又一次地走到这堵墙上。@jldupont我们想知道你真正想做什么的原因是因为它以120分贝的声音尖叫着。无论你的问题是什么,我相信有一个好的解决方案,它不涉及你的问题的文本要求。这正是我的答案试图解决的问题,但被否决了。:-)请重读这个问题:我想要一个解决方案,这样我就有了“type(SomeParam)==Param”。我不需要解释为什么它不能像这里描述的那样工作。@jldupont这就像要求
print(x)
增加
x
。这是错误的,没有意义。您可以让define函数为您提供/a超类,也可以测试某物是否是其他某物的子类,但这两种操作与
type()
的操作完全不同。@jldupont请重新阅读答案。他试图解释为什么你的要求是不可能的。
type(SomeParam)==Param