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

python class属性

岳志义
2023-03-14
问题内容

我对python中的类属性有疑问。

class base :
    def __init__ (self):
        pass
    derived_val = 1

t1 = base()
t2 = base ()

t2.derived_val +=1
t2.__class__.derived_val +=2
print t2.derived_val             # its value is 2
print t2.__class__.derived_val   # its value is 3

结果是不同的。我还使用id()函数找到t2.derived_val和t2。.derived_val
具有不同的内存地址。我的问题是派生的_val是类属性。为什么上面的示例不同?是因为类的实例在class属性旁边复制了自己的named_val吗?


问题答案:

有类属性和实例属性。当你说

class base :
    derived_val = 1

您正在定义一个类属性。derived_val成为的关键 base.__dict__

t2=base()
print(base.__dict__)
# {'derived_val': 1, '__module__': '__main__', '__doc__': None}
print(t2.__dict__)
# {}

当您说t2.derived_valPython尝试在中找到“
derived_val”时t2.__dict__。由于它不存在,因此将检查的'derived_val'任何基t2类中是否存在键。

print(t2.derived_val)
print(t2.__dict__)
# 1
# {}

但是,当您将值分配给时t2.derived_val,您现在要向添加实例属性t2。一derived_val键加入t2.__dict__

t2.derived_val = t2.derived_val+1
print(t2.derived_val)
print(t2.__dict__)
# 2
# {'derived_val': 2}

请注意,此时有两个derived_val属性,但是只有实例属性易于访问。只能通过引用base.derived_val或直接访问class
dict来访问class属性base.__dict__



 类似资料:
  • 问题内容: 是HTML的属性吗? 我应该做还是 我读了很多文章,但仍然感到困惑。 有人可以向我解释一下HTML / JS中的属性与属性之间的区别是非常简单的吗? 问题答案: 属性由HTML定义。属性(在DOM元素上)由DOM(以及HTML 5定义,模糊了标记和DOM之间的边界)。 一些HTML属性具有1:1映射到属性。就是这样的一个例子。 有时名称是不同的。该属性映射到该属性,该属性映射到该属性(

  • 本文向大家介绍innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解,包括了innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解的使用技巧和注意事项,需要的朋友参考一下 innerHTML属性用来读取或设置某个节点内的HTML代码。 outerHTML属性用来读取或设置HTML代码时,会把节点

  • 属性与Java中的字段是相同的,但是更加强大。属性做的事情是字段加上getter加上setter。我们通过一个例子来比较他们的不同之处。这是Java中字段安全访问和修改所需要的代码: public class Person { private String name; public String getName() { return name; }

  • 本文重要内容 CSS的单位 字体属性 文本属性 定位属性:position、float、overflow等 CSS的单位 html中的单位只有一种,那就是像素px,所以单位是可以省略的,但是在CSS中不一样。CSS中的单位是必须要写的,因为它没有默认单位。 绝对单位: 1 in=2.54cm=25.4mm=72pt=6pc。 各种单位的含义: in:英寸Inches (1 英寸 = 2.54 厘米

  • 属性是应用于某些模块、crate 或项的元数据(metadata)。这元数据可以用来: 代码的条件编译 设置 crate 名称、版本和类型(二进制文件或库) 禁用 lint (警告) 启用编译器的特性(宏、全局导入(glob import))等] 链接到一个非 Rust 语言的库 标记函数作为单元测试(unit test) 标记作为基准某个部分的函数 当属性用于一个完整的 crate 时,它们的语

  • 部署在WebSphere服务器上的应用程序可以更改某些JVM属性(例如时区)。此类更改会影响该服务器上的所有应用程序。有没有一种方法可以防止应用程序在运行时更改JVM属性。我想知道我们是否可以在WebSphere服务器中设置一些属性,这样可以防止应用程序在运行时更改JVM上的任何内容。这就像让JVM属性由IBMWebSphere服务器控制,而不是在其上部署应用程序。

  • 属性 我们已经详细讲述了Subversion存储和检索版本库中不同版本的文件和目录的细节,并且用了好几个章节来论述这个工具的基本功能。如果对于版本化的支持到此为止,从版本控制的角度来看Subversion已经完整了。 但不仅仅如此。 作为目录和文件版本化的补充,Subversion提供了对每一个版本化的目录和文件添加、修改和删除版本化的元数据的接口,我们用属性来表示这些元数据。我们可以认为它们是一

  • 属性可以将值与特定的类、结构体或者是枚举联系起来。存储属性会存储常量或变量作为实例的一部分,反之计算属性会计算(而不是存储)值。计算属性可以由类、结构体和枚举定义。存储属性只能由类和结构体定义。 存储属性和计算属性通常和特定类型的实例相关联。总之,属性也可以与类型本身相关联。这种属性就是所谓的类型属性。 另外,你也可以定义属性观察器来检查属性中值的变化,这样你就可以用自定义的行为来响应。属性观察器