Python 类成员

2024-03-27

我刚刚学习 Python,并且有 C 背景,所以如果我对两者有任何困惑/混淆,请告诉我。

假设我有以下课程:

class Node(object):
    def __init__(self, element):
        self.element = element
        self.left = self.right = None

    @classmethod
    def tree(cls, element, left, right):
        node = cls(element)
        node.left = left
        node.right = right
        return node

这是一个名为Node,它会重载构造函数,以便能够在需要时处理不同的参数。

定义和定义有什么区别self.element in __init__仅(如上所示)而不是执行以下操作:

class Node(object):
    element, left, right = None
    def __init__(self, element):
        self.element = element
        self.left = self.right = None

Isn't self.element in __init__和班级的一样element变量定义?那不是会覆盖吗element from None to the element值传递到__init__?


一个是类属性,另一个是实例属性。它们是不同的,但它们彼此密切相关,有时使它们看起来很相似。

它与 python 查找属性的方式有关。有一个层次结构。在简单的情况下,它可能看起来像这样:

instance -> Subclass -> Superclass -> object (built-in type)

当你寻找一个属性时instance像这样...

`instance.val`

...实际发生的情况是first, Python 寻找val在实例本身中。然后,如果没有找到val,它看起来在同类中,Subclass。然后,如果没有找到val在那里,它看起来在父项中Subclass, Superclass。这意味着当您执行此操作时...

>>> class Foo():
    foovar = 10  
    def __init__(self, val):
        self.selfvar = val

...的所有实例Foo share foovar,但又有自己独特的selfvars。这是一个简单、具体的示例来说明其工作原理:

>>> f = Foo(5)
>>> f.foovar
10
>>> Foo.foovar
10

如果我们不碰触foovar,两者都是一样的f and Foo。但如果我们改变f.foovar...

>>> f.foovar = 5
>>> f.foovar
5
>>> Foo.foovar
10

...我们添加一个实例属性,它有效地掩盖了Foo.foovar。现在如果我们改变Foo.foovar直接,不影响我们foo实例:

>>> Foo.foovar = 7
>>> f.foovar
5

但它确实影响了新的foo实例:

>>> Foo(5).foovar
7

还要记住,可变对象添加了另一层间接性(正如 mgilson 提醒我的那样)。这里,f.foovar指的是同一个对象Foo.foovar,因此当您更改对象时,更改会沿层次结构向上传播:

>>> Foo.foovar = [1]
>>> f = Foo(5)
>>> f.foovar[0] = 99
>>> Foo.foovar
[99]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 类成员 的相关文章

随机推荐

  • 二维数组的按行 numpy.isin [重复]

    这个问题在这里已经有答案了 我有两个数组 A np array 3 1 4 1 1 4 B np array 0 1 5 2 4 5 2 3 5 是否可以使用numpy isin二维数组按行排列 我想检查一下是否A i j is in B
  • 使用用户定义的运行时属性的 UILabel 的cornerRadius 不起作用

    我尝试使用将cornerRadius添加到UILabelUser Defined Runtime Attributes但它没有按预期工作 cornerRadius 没有设置 我想知道我在哪里犯了错误 我附上了它的截图 帮我解决一下 It i
  • JavaScript 中的构造函数和继承

    这是关于 JavaScript 中的 继承 假设我创建一个构造函数 Bird 和另一个名为 Parrot 的构造函数 通过将 Bird 的实例分配给 Parrot 的原型来 继承 Bird 的属性 如以下代码所示 function Bird
  • 使用前缀路由时 url 中的 CakePHP3.x 控制器名称

    我正在尝试在 CakePHP3 中使用前缀路由 我将以下几行添加到 config routes php Router prefix admin function routes All routes here will be prefixed
  • Prefuse:向 GraphView 演示添加边权重

    我正在使用 prefuse 可视化工具包 工具包中的 GraphView 演示非常出色 提供了各种控件来可视化数据 我能够为我的数据集生成 GraphML 并使用 GraphView 对其进行可视化 我希望拥有的另一件事是使用权重或颜色编码
  • Elasticsearch:使用 Java 添加手动映射

    我无法更改映射 有人能帮我找到代码中的错误吗 我根据几个教程找到了更改映射的标准方法 但是 当我尝试调用映射结构时 在手动创建映射后只会出现一个空白映射结构 但是插入一些数据后就会出现映射规范 因为ES当然使用默认的映射规范 更具体的请看下
  • Php $_POST方法获取textarea值

    我正在使用 php 使用 post 方法获取 textarea 值 但得到一个奇怪的结果 让我向你展示我的代码
  • 在没有 VSDBCMD 的情况下部署 VS2010 数据库项目?

    自首次引入 Visual Studio 2010 的数据库项目以来 我们一直在多个内部或单一客户项目中使用它们 到目前为止 它们对我们来说运行良好 现在 我们第一次将它们与 盒装 产品一起使用 该产品需要打包才能安装在任意客户站点 到目前为
  • 可靠的WebSocket连接状态检测

    我一直在寻找实现可靠的 WebSocket 连接恢复机制 经过一番调查 我发现一种方法是将心跳发送到服务器 ping pong 并检查我是否收到整个pong在有限的时间内 因此 如果连接实际上已断开或速度非常慢 则会被视为断开连接 if a
  • 如何修复IntelliJ IDEA方法参数自动完成?

    我正在使用 IntelliJ IDEA 15 我注意到 默认情况下 Eclipse 在编写需要多个参数的方法调用时提供了更方便的自动完成功能 Eclipse 会自动填充默认参数 并允许您通过按快速浏览它们Tab IntelliJ 不这样做
  • 打印转换后的 XML

    由于情况超出了我的控制范围 我将用自制的 XML 报告替换所有的 Crystal 报告 这些报告运行得非常好 对于大多数弹出 Crystal Reports 查看器的报表 以下代码可以在 IE 中很好地打开它们 并通过 XSLT 样式表将其
  • DRF Serializer - 如何返回外键字段?

    早上好 我真的很难解决从 Django Rest Framework API 返回值的问题 我有两个模型 SirTarget 和 Status SirTarget 就像一张票证 而 Status 是票证的文本状态标签 对应于处理票证的阶段
  • 来自 Properties 的 C# 自定义属性

    所以我有一个来自我的类 的属性集合 我想循环遍历它 对于每个属性 我可能有自定义属性 因此我想循环遍历这些属性 在这种特殊情况下 我的城市类别有一个自定义属性 public class City ColumnName OtroID publ
  • Swift / SKStoreProductViewController PushViewController 结果为(lldb)

    为了将用户推送到 iTunes 商店获取所需的项目 我使用以下函数 func openStoreProductWithiTunesItemIdentifier identifier String let storeViewControlle
  • 使用 pytest-django 进行测试期间,Django 连接对象看不到第二个数据库的表

    底线 在使用 pytest django 进行测试期间 我的 Django 连接对象看不到第二个数据库的表关系 概述 我有一个问题 我的 Django 连接对象似乎获取了错误的数据库信息 当我查询 客户 数据库中的表时 我偶然发现了这个问题
  • 文本编辑器的动态高度

    我正在努力适应TextEditor里面一个ScrollView 有没有办法制作TextEditor只占用适合所有文本所需的空间 或者简单地说 如何改变height of the TextEditor动态地适应所有文本 你可以把它放在一个ZS
  • 取消 AJAX 请求会减慢后续导航速度

    在我的应用程序中 当用户请求报告时 jquery AJAX 使用 load 调用一个执行大量数字运算和 mySQL 请求的文件 加载一般需要5 6秒 ajaxStart and ajaxStop 用于在加载期间显示加载 gif 问题 如果用
  • 为什么我的 CompletableFuture 代码可以在 Java 8 中运行,但不能在 Java 11 中运行?

    为什么这段代码在 Java 8 和 Java 11 中的行为不同 private static String test2 CompletableFuture runAsync gt IntStream rangeClosed 1 20 fo
  • 使用布局将面板设置在屏幕中央

    我尝试使用以下方法将子面板的位置设置在父面板的中心 parent panel setLayout new BorderLayout parent panel add child panel BorderLayout CENTER 但它被添加
  • Python 类成员

    我刚刚学习 Python 并且有 C 背景 所以如果我对两者有任何困惑 混淆 请告诉我 假设我有以下课程 class Node object def init self element self element element self l