当前位置: 首页 > 面试题库 >

如何保护内置类型不覆盖(分配)其方法?

宁欣怿
2023-03-14
问题内容

我注意到

int.__str__ = lambda x: pass

产生一个错误。

我明白了,为什么禁止这样做。但是如何?我可以在“普通”代码中使用它吗?


问题答案:

为了直接在int自身和其他内置类型(而不是其实例)type.__setattr__上设置属性,此保护发生在中,该保护明确禁止在内置类型上设置属性:

static int
type_setattro(PyTypeObject *type, PyObject *name, PyObject *value)
{
    int res;
    if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
        PyErr_Format(
            PyExc_TypeError,
            "can't set attributes of built-in/extension type '%s'",
            type->tp_name);
        return -1;
    }
    ...

Py_TPFLAGS_HEAPTYPE 是指示是否在Python中而不是C中定义类型的标志。

除非在C中实现它们,否则您无法对自己的类做同样的事情。您可以假装通过使用custom编写一个元类来做到这一点__setattr__,但这会使使用其他有用的元类变得更加复杂,而且仍然不会防止有人type.__setattr__直接调用您的课程。(尝试使用类似的技巧object.__setattr__(int, ...)是行不通的,因为要进行特定的检查才能发现该错误。)

您没有询问内置类型的实例,但是它们也很有趣。大多数内置类型的实例不能仅仅因为无处放置此类属性-
而没有在其上设置属性__dict__。它们通常没有继承特殊的“不允许设置”__setattr__或缺少a
__setattr__,而不是继承__setattr__object,后者知道如何处理no的对象__dict__

descr = _PyType_Lookup(tp, name);

if (descr != NULL) {
    Py_INCREF(descr);
    f = descr->ob_type->tp_descr_set;
    if (f != NULL) {
        res = f(descr, obj, value);
        goto done;
    }
}

if (dict == NULL) {
    dictptr = _PyObject_GetDictPtr(obj);
    if (dictptr == NULL) {
        if (descr == NULL) {
            PyErr_Format(PyExc_AttributeError,
                         "'%.100s' object has no attribute '%U'",
                         tp->tp_name, name);
        }
        else {
            PyErr_Format(PyExc_AttributeError,
                         "'%.50s' object attribute '%U' is read-only",
                         tp->tp_name, name);
        }
        goto done;
    }
    ...


 类似资料:
  • 问题内容: 在UIViewController中,此代码: 给出错误 我正在使用Xcode 8 beta 4,且iOS部署目标是9.0,并且在 如何将上面的代码转换为Swift 3? 问题答案: 像这样: …还有其余的。 一般模式 现在,许多Cocoa方法都是属性,因此您可以将它们实现为重写计算变量。因此,从种子3(或更早)移动到种子4的模式是: 更改为 删除 更改为 之所以可行,是因为计算的变量

  • 问题内容: 我更新到Xcode 8 beta 5,现在在从UIView继承的类上收到以下错误: 有解决方法吗? 问题答案: 请检查最新参考。(您只需在Apple开发者网站的搜索栏中输入“ intrinsicContentSize”,就可以轻松找到它。) 宣言 已成为计算属性,因此您需要以这种方式覆盖它: 或者简单地:

  • 问题内容: 关键字授予对相同包和子类(http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html)中的类的访问权限。 现在,每个类都有一个超类(http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html)。 因此,我得出结论,即使每个类都可以访问的方法。

  • 与此问题相关。为了自定义我在自定义层中创建的内核配置,此结构: 其中文件实际上是用于手动编译内核(请参阅其他问题)。文件包含以下代码: 我确信该文件已得到处理,因为如果我更改 defconfig 的名称,则会引发“找不到文件”错误。 问题是编译后的内核没有我的自定义。但是如果我将我的deconfig复制到构建目录(即

  • 我正在尝试对涉及DStreams的Spark Streaming应用程序执行一些单元测试。 我发现下面这套很有用:StreamingSuiteBase。它包含一个名为testOperation的方法,您可以向该方法传递一个输入、一个要测试的操作和一个预期的输出。它将验证您的预期输出是否与实际输出相匹配。 我面临的问题是,在相等验证期间,我确实得到了完全相同的对象,但包装成不同的集合: 预期:列表(

  • 目前,我可以让sonarqube使用mvn sonar:sonar扫描一些文件,但我永远无法获得代码覆盖率。我浏览了所有文档,并将jacoco包括在我的pom中,并试图设置项目属性以反映代码的结构。我以前没有真正使用过maven,所以这个任务有点难。有人能为我提供一个“像我五岁一样解释”的解决方案吗。我也有多个模块。

  • 问题内容: 我想为 isEmpty 方法添加自定义行为。 当我从 我应该重写序列化方法,因为它是抽象的。 我想按原样保留序列化方法,并仅覆盖isEmpty方法。 问题答案: 为了修改行为但保持默认的序列化,您可以利用 serializer修饰符 。您仍然必须实现自定义序列化程序,但是可以非常干净地利用默认序列化程序。 使用默认的序列化器创建一个自定义序列化器 将变量插入到您的自定义序列化器类中。当

  • 问题内容: 由于Xcode 6在Swift中仍然存在很多错误,因此我不确定是其中之一还是缺少某些东西。我的班采用协议NSLayoutManagerDelegate。但是似乎无法覆盖我需要的方法。我做的文档描述如下: 但是我在这里遇到错误:方法不会覆盖其超类中的任何方法。我该怎么办? 问题答案: 是的,您正在从协议中实现方法,但这不是替代。只需删除关键字。覆盖是指您的超类也实现该方法,并且您要提供一