- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
注意:使用 Python 实现享元实现的一部分
import weakref
class CarModel:
_models = weakref.WeakValueDictionary()
def __new__(cls, model_name, *args, **kwargs):
model = cls._models.get(model_name)
if not model:
model = super().__new__(cls)
cls._models[model_name] = model
return model
def __init__(self, model_name, air=False):
if not hasattr(self, "initted"):
self.model_name = model_name
self.air = air
self.initted=True
super()
意思?是否表示
CarModel
的父类? ?
__new__
的函数是如何实现的作品?具体如下。
model = super().__new__(cls)
__new__
的说明:
The constructor function is called
__new__
as opposed to__init__
, and accepts exactly one argument, the class that is being constructed (it is called before the object is constructed, so there is no self argument). It also has to return the newly created object.
最佳答案
从 super()
开始本身只是 super(A, B)
的简写,其中 A
是代码所在的类,B
是代码所在函数的第一个参数;所以在你的特殊情况下,super().__new__(cls)
扩展为 super(CarModel, cls).__new__(cls)
.
反过来,super(T, O)
返回一个“ super 对象”。要了解 super 对象的作用,您需要了解实例和类上的属性引用在 Python 中是如何工作的。
假设没有 __getattr__
或 __getattribute__
涉及方法,引用属性 A
在对象上 O
(即,评估 O.A
或 getattr(O, "A")
)通过以下步骤进行:
"A"
在 O
中定义的实例 dict ( O.__dict__
),那么该 dict 上的值将直接返回,原样。 O
中的每个类的方法解析顺序依次检查,查找"A"
在他们的每个字典中。如果找到,调用值 D
. D
,反过来,不定义 __get__
,然后按原样返回。但是,如果确实如此,则 D
被称为“描述符”,其 __get__
使用 O
调用方法作为第一个参数,和 type(O)
作为第二个论点。 __get__
使用 None
调用方法作为第一个参数,而被引用的类作为第二个参数。 super(T, O)
创建的 super 对象,那么,是一个(内置)对象,带有
__getattribute__
在其上的每个属性引用上调用的方法,并在
O
中 T 之后的唯一类的字典中查找该属性。的 MRO。然后它找到的值,它调用
__get__
像往常一样。
CarModel
按原样定义,其 MRO 为
[CarModel, object]
.
super().__new__(cls)
扩展为 super(CarModel, cls).__new__(cls)
, 如上所述。 super(CarModel, cls)
被评估以产生一个 super 对象 S
. "__new__"
在 S
(相当于在 Python 代码中调用 getattr(S, "__new__")
)。 S
创建于 CarModel
类,它考虑以下类 CarModel
在 CarModel
的 MRO 中,并找到 "__new__"
在 object
的字典中类本身。它的值,一个静态方法,有一个 __get__
方法,使用参数 None
调用和 cls
.自 __new__
是一个静态方法,它的 __get__
方法只是按原样返回函数,未修改。因此,super(CarModel, cls).__new__
与object.__new__
完全相同. object.__new__
)用 cls
调用参数,其中 cls
大概是 CarModel
,终于有了 CarModel
的新实例类(class)。 __new__
类上的实际
object
函数实际上并不是一个静态方法,而是一个根本没有
__get__
方法的特殊内置函数,但是因为
__get__
静态方法上的方法只是返回它们定义的函数,所以效果是一样的。)
关于python - `super()` 在 `__new__` 中有什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9056955/
问题比较Java,但是我想在Android中实现: 假设有 3 个或更多类相互扩展: class A { ... int color; ... } class B extend
我知道标题听起来有点奇怪,但这正是我愿意做的。简单解释:A类是B类的子类,B类也是C类的子类>. 现在,所有这些类都包含方法m()。在我的 A 类中,这是我唯一可以访问的类,因为其他类仅在运行时可用,
我有一个 UIViewController 类 A 和 B。 A 使用以下方式加载 B:[A.view addSubView B.view]。 B 有一个带有“后退”按钮的导航栏。我想在单击时返回到
我有以下(第三方)类结构。我们将调用第三方项目 ProjectSeriously,并注意我使用 System.out.println 代替其他复杂的功能(100 行代码) . class A {
在下面的代码中,我从 Game 扩展了 MyGame。我有两个问题: 我们是否需要为所有render()、dispose()、pause()调用super方法 和 resize(w,h)?很多人都没有
例如,假设我想在调用 super.viewDidLoad() 时跳过一级。所以我希望能够做这样的事情: override func viewDidLoad() { super.super.vi
public class Faculty extends Employee { public static void main(String[] args) { new Fac
假设我有: class Superclass { //fields... methodA() {...} methodB() {...} ... } class Subclass exte
这个问题在这里已经有了答案: Why is super.super.method(); not allowed in Java? (22 个答案) 关闭 9 年前。 我怀疑我想做的事情是否可行。我有
我有一个实现 Initializable 的类。 public abstract class ExampleClass implements Initializable { public vo
我想知道,我有这个大数组,是否可以只在内存中使用一次而不是每个线程一次?以 stackoverflow 上的标签为例。他们几乎从不改变,为什么不为他们留下一个内存点呢?甚至可能将该数组永久保存在内存中
假设这三个类具有这个简单的层次结构: class A { func foo() { print("A") } } class B: A { override fu
有没有办法在 TypeScript 中调用 super.super.methodName。我想避免调用super.methodName,但我想调用二祖的methodName方法。 谢谢。 最佳答案 T
这个问题已经有答案了: When do I use super()? (11 个回答) 已关闭 7 年前。 package Geometry; public abstract class Geomet
我必须执行and()在我的实现 Predicate 的业务对象上. 出现问题的代码是 and() 行调用: Predicate predicate = new M
我有一个实现接口(interface)的抽象父类(super class): public abstract class FooMatrix implements Matrix { publi
我有四个 UIView:viewA 是 Root View ,它有 viewB 作为它的 subview 。 viewB 将 viewC 作为其 subview ,而 viewC 将 viewD 作为
有什么区别: class Child(SomeBaseClass): def __init__(self): super(Child, self).__init__() 和:
我有一个通用接口(interface) interface ListList extends List> .由于某些原因,我无法转换 ListList至 List> .有什么方法可以做到吗?为什么它不
我想调用带有两个参数的父类(super class)的构造函数,所以我调用了 super(arguments),但是编译器说: “类 Person 中的构造函数 Person 不能应用于给定类型; 要
我是一名优秀的程序员,十分优秀!