【问题标题】:Overwriting(extending) default classes?覆盖(扩展)默认类?
【发布时间】:2017-06-28 22:34:27
【问题描述】:

我希望在创建int/set/str/dict/etc 的新对象时能够覆盖默认类。

ints 的示例:

class MyInt(int):
    def __call__(self):
        return self ** 2

int = MyInt

a = int('2')
b = 3
print(a)
print(a())
print(int(3)())

print(5()) # Error -> this is what interests me to get working.

有可能吗?

【问题讨论】:

  • 当然可以使用 AST,不知道其余的。
  • 只有 5 个将始终具有内置类型 int。当您编写 int = MyInt 时,您不会替换 buildin int。您只需创建本地变量。

标签: python class extend built-in


【解决方案1】:

我认为您必须再次阅读一些 Python 标识符约定。

Python 标识符:

Python 标识符是用于标识变量、函数、类、模块或其他对象的名称。标识符以字母 A 到 Z 或 a 到 z 或下划线 (_) 开头,后跟零个或多个字母、下划线和数字(0 到 9)。

Python 不允许在标识符中使用标点符号,例如 @、$ 和 %。 Python 是一种区分大小写的编程语言。因此,Manpower 和 manpower 在 Python 中是两个不同的标识符。

以下是 Python 标识符的命名约定:

  • 类名以大写字母开头。所有其他标识符都以小写字母开头。

  • 以单个前导下划线开头的标识符表示该标识符是私有的。

  • 以两个前导下划线开头的标识符表示高度私有的标识符。

  • 如果标识符也以两个下划线结尾,则标识符是语言定义的特殊名称。

因此,您的代码将因5() 而失败,因为它没有填写Python 命名/标识符规则。

否则,您可以将您的代码破解成这样:

class MyInt(int):
    def __call__(self):
        return self ** 2

int = MyInt
a = int('2')
print(a)
print(a())
print(int(3)())
# Note here the underscore '_'
_5 = int('3')
print(_5)
print(_5())

输出:

2
4
9
3
9

【讨论】:

  • 再举一个例子:a = 5; a.real 有效。 5.real 没有
  • 是的,因为5 将始终是一个内置类型int。所以解释器不会理解5.real,会抛出SyntaxError异常。
  • 对不起,令人困惑的评论。 5.real 不起作用,因为语法分析器在点之后等待小数部分。 (5).real5.0.real 工作。
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
相关资源
最近更新 更多