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

Python类成员

胡高朗
2023-03-14
问题内容

我只是在学习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__init__只(如上图所示),而不是执行以下操作:

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

是不是self.element__init__相同类的element变量定义?难道不只是覆盖element从传递到Noneelement__init__


问题答案:

一个是类属性,而另一个是实例属性。它们是不同的,但是它们之间的紧密联系使它们有时看起来相同。

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

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

当您寻找这样的属性时instance

`instance.val`

…实际发生的是, 首先
,Pythonval在实例本身中进行查找。然后,如果找不到val,它将在其类中查找Subclass。然后,如果它没有找到val那里,它看起来的父母SubclassSuperclass。这意味着当您这样做时…

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

…所有Foo share 实例foovar,但有各自不同selfvar的。这是一个简单的具体示例:

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

如果我们不碰foovar,则f和都相同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]


 类似资料:
  • 问题内容: 我最近刚与Python中的一个错误作斗争。那是那些愚蠢的新手错误之一,但是它让我思考了Python的机制(我是C ++的老程序员,是Python的新手)。我将列出错误的代码并解释如何解决该问题,然后我有两个问题。 场景:我有一个叫做A的类,它有一个字典数据成员,下面是其代码(当然这是简化的): 使用此代码的类为B类: 请注意,每次调用都会初始化类A的新“干净”实例,并在添加前后打印字典

  • 本文向大家介绍Python 实现子类获取父类的类成员方法,包括了Python 实现子类获取父类的类成员方法的使用技巧和注意事项,需要的朋友参考一下 大家好,今天在写代码的时候,遇到了这样一种情况。我有如下所示的几个类用来存放程序配置(其实当做命名空间来用,同时感觉能够继承方便一点), 然后我在子类中想要访问父类的类成员变量,而且这两个类都是只有类成员变量。感觉目前我使用的方法笨一点,就是直接引用父

  • 本文向大家介绍Python 关于反射和类的特殊成员方法,包括了Python 关于反射和类的特殊成员方法的使用技巧和注意事项,需要的朋友参考一下 反射 反射即想到4个内置函数分别为:getattr、hasattr、setattr、delattr  获取成员、检查成员、设置成员、删除成员 dir([obj]): 调用这个方法将返回包含obj大多数属性名的列表(会有一些特殊的属性不包含在内)。obj的默

  • 注:内容翻译自官网文档 Language Guide (proto3) 中的 Generating Your Classes 一节 为了生成Java, Python, C++, Go, Ruby, JavaNano, Objective-C, 或者 C# 代码, 需要处理定义在.proto文件中的消息类型, 需要在.proto文件上运行protocol buffer编译器protoc. 如果你没有

  • 类的每个对象有自己的所有数据成员的副本,有时类的所有对象应共享变量的一个副本,因此可以使用 static 类变量。stattic 类变量表示的是类范围中所有对象共享的信息。static 类成员的声明以 static 关键字开始。 下面用一个视频游戏的例子说明 static 类共享数据的作用。假设视频游戏中有 Martian 和其他太空人。每个 Martian 都很勇敢,只要有5个 Martian

  • 本文向大家介绍Python程序从类的对象形成字典,包括了Python程序从类的对象形成字典的使用技巧和注意事项,需要的朋友参考一下 当需要在对象和类的帮助下形成字典时,将定义一个类。定义了一个“ init”函数,该函数将值分配给变量。创建该类的实例,并调用init函数。 示例 以下是相同的演示- 输出结果 解释 定义了一个“ base_class”,并将一个对象传递给它。 定义了一个“ init”