问题标签 [new-style-class]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
51 浏览

python - 为什么 setter 在新式类和旧式类中的行为不同

使用 python 2.7,假设我有一个Test具有下面定义的新型类语法的类。

运行上面的代码将打印5,4,4出所需的行为。但是,如果我将上面代码的第一行更改为,class Test:则结果变为5,4,5.

有谁知道是什么导致了这种输出差异?

0 投票
2 回答
546 浏览

python - 我们如何强制 getattribute() 为魔术方法(特殊方法)调用?

python 文档指出在__getattribute__查找特殊方法时可能会被绕过。这是通过语言语法或内置函数隐式调用的结果。

例如,

不一样:

下面是另一个例子:

我想编写一个名为的MagicOverrider类,例如继承自MagicOverrider always的任何类都调用__getattribute__,而不是绕过它。我的问题是我们怎么能做到这一点?

我尝试了以下方法:

但是,我的解决方案至少有两个问题:

  • 如果在未来的 python 版本中引入了新的魔法方法,它将不再起作用
  • 第一行, class MagicOverrider:, 抛出TypeError: 'function' object is not iterable
0 投票
0 回答
47 浏览

python - python中的对象和类型有什么区别

众所周知,Python 2.x 中有两种类型的类,如旧样式类和新样式类

Oldstyle 类的type实例总是instance

新样式类有,等优点method descriptors, NewStyle 类的实例就是类名本身supergetattributetype

当您检查 NewStyle 类的类型是类型并且类型object也是类型时

那么继承新样式类的概念是什么object,正如我们在上面看到的那样,type(type)也是typetype(object)也是type

为什么我们不能直接继承新的样式类type

我们可以假设以下几点来区分objecttype吗?

  1. 如果我们从下面继承/创建一个类type,我们肯定会最终创建一个元类吗?(一切都是python中的对象,包括类,都是其他类的对象type

class NewStyle(type): pass

当 Python 解释器看到上面的代码时,它会创建一个类型为class(类对象)的对象/实例,名称为 NewStyle(它不是普通实例,而是类对象)

  1. 如果我们从 继承/创建一个类object,它将创建该类的普通实例/对象

class NewStyle(object): pass isinstance(NewStyle, type)

obj = NewStyle() print isinstance(obj, NewStyle) # True print isinstance(NewStyle, type) #True print isinstance(NewStyle, object) #True print isinstance(object, type) # True print isinstance(type, object) # True

那么最后我们使用type创建类,但我们使用object创建实例?

0 投票
3 回答
402 浏览

python - 如何从仅影响一个类的内置函数中导入对象?

我正在将代码从 python2 转换为 python3 用于newstyle使用future. 我的项目在 Django 1.11 中

我在 forms.py 中有一个类:

在 Python 2 中

转换为:

在 Python 3 中

我有一个 selenium 测试,它在转换为 Python3 后调用此表单时失败,并出现以下错误:

但是,当我删除导入时from buitlins import object,测试通过了。

但是当我添加了一个未来的检查时,我得到了一个未来的差异错误,因此每个类都必须转换为 newstyle。我希望它在 Python2 和 Python3 中都能工作。

有没有办法这个模块builtins模块导入可以只影响一个类而不影响forms.py文件中的其他类。还是有其他方法可以解决这个问题?

0 投票
3 回答
192 浏览

python - 从 python 抽象工厂中导入

我想创建一个抽象工厂,以便在 Python 2.7 中抽象计算机(比如 RaspberryPi 和 Arduino)之间的硬件差异。

我正在使用抽象工厂的以下实现:

实例化工作正常,但是当我尝试运行它时,我得到:

所以导入arduino_display确实有效,但我找不到在对象中使用它的方法。

需要条件导入,因为不同的平台将安装不同的模块。

知道如何使用这些条件导入吗?

我尝试过self.arduino_displayArduinoDisplay.arduino_display但无济于事。

我显然可以捕获导入错误,例如添加到顶部:

...这会在 RPI 上失败,这很好,但必须有更好的方法...