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

Python类属性及其初始化

韩琛
2023-03-14
问题内容

我是python的新手,最近这些天我在探索课程。我有一个关于类内部的属性和变量的问题:通过仅q=1在类的主体中定义属性和通过self.q=1在内部定义属性有什么区别__init__?例如,以下两种可能性之间有什么区别?

class MyClass1:
    q=1
    def __init__(self,p):
        self.p=p
    def AddSomething(self,x):
        self.q = self.q+x

class MyClass2:
    def __init__(self,p):
        self.q=1
        self.p=p
    def AddSomething(self,x):
        self.q = self.q+x

输出例如:

>>> my=MyClass1(2)
>>> my.p
2
>>> my.q
1
>>> my.AddSomething(7)
>>> my.q
8

不依赖于是否MyClass1MyClass2使用。进入MyClass1或进入MyClass2都不会发生错误。


问题答案:

python中的类及其实例使用类似字典的数据结构来存储信息。

因此,对于每个类定义,将分配一个字典,用于存储类级别信息(类变量)。并且对于该特定类的每个实例,将分配一个单独的字典(自身),该实例将在其中存储实例特定信息(实例变量)。

现在,下一个问题是: 如何执行对特定名称的查找?

这个问题的答案是,如果您通过某个实例访问名称,则将首先搜索实例特定的词典,如果在该实例中找不到名称,则将在类词典中搜索该名称。因此,如果在两个级别上定义了相同的值,则将覆盖前一个值。

请注意,当您编写d [‘key’] = val时,其中d是字典,如果’key’不存在,它将自动添加到字典中。
否则,当前值将被覆盖。在阅读进一步的说明之前,请记住这一点。

现在,让我们看一下您用来描述问题的代码:

MyClass1

class MyClass1:
    q=1
    def __init__(self,p):
        self.p=p
    def AddSomething(self,x):
        self.q = self.q+x
1. my = Myclass1(2) #create new instance and add variables to it.

    MyClass = {"q" : 1}
    my = {"p" : 2}
2. my.p    # =2, p will be taken from Dictionary of my-instance.
3. my.q    # =1, q will be takn from MyClass dict. (Not present in dictionary of my-instance).
4. my.AddSomething(7) # This method access the value of q (using self.q) first 
                      # which is not defined in my dict and hence will be taken
                      # from dictionary of MyClass. After the addition operation,
                      # the sum is being stored in self.q. Note that now we are
                      # adding the name q to Dictionary of my-instance and hence                   
                      # a new memory space will be created in Dictionary of my-instance
                      # and the future references to self.q will fetch the value
                      # of self.q from dictionary of my-instance.

    MyClass = {"q" : 1}
    my = {"p" : 2, "q" : 8}
5. my.q   # =8, q now is available in dictionary of my-instance.


 类似资料:
  • 我有一份抽象的课堂报告: 我需要强制所有子类填充此 surrogateId 属性。(如果子类未填充属性,则会出现编译错误) 我尝试使用 final 关键字来强制我在构造函数中引入此属性的值,但我必须手动生成构造函数而不是使用 Lombok,很多样板代码。有没有办法在不手动生成结构的情况下实现相同的期望。

  • 我在想,是否可以使用对< code>this关键字的引用来初始化一个(引用类型)属性(当它的值为< code>null),而不使用构造函数。< br >在某些情况下,我不想使用构造函数来初始化属性,因此,如果没有人访问它,它的值将不会被创建。< br >此外,如果可能的话,我不喜欢在构造函数中将属性声明与其初始化分开。 一个典型的例子是MVVM模式编程的命令声明: 我不喜欢写三倍的成员的名字… 我

  • 问题内容: 定义 类属性和 初始化 它们之间有区别吗?在某些情况下,您想彼此做一个吗? 例: 以下代码段应指出我的意思。我在那里使用一个原语和一个对象: 与 问题答案: 首先,您不能将原语设置为null,因为原语只是数据,其中是对象引用。如果尝试编译,则会收到不兼容的类型错误。 其次,像在Java中那样,在类中将变量初始化为或在类中声明变量时是多余的,原语默认为(或),对象引用默认为。局部变量不是

  • 问题内容: 在php中声明属性时,为什么无法将属性初始化为函数?以下代码片段导致 解析错误:语法错误,意外的T_FUNCTION 您还可以将属性初始化为字符串,数字或其他数据类型吗? 编辑: 但是我可以在__construct()方法中将函数分配给属性。以下工作正常: 问题答案: 因为它不是用PHP实现的。 http://www.php.net/manual/zh/language.oop5.pr

  • 但是我得到错误“在初始化之前使用属性”这是有道理的,因为我只声明。但是我不知道我应该如何或为了什么初始化输入,因为值是输入

  • 问题内容: 您将如何在Swift中实现以下模式? 所述类被初始化,其中包含的词典JSON数组。这些字典用于初始化类。但是,当访问或属性时,对象的初始化会延迟进行。 问题答案: 看来这个问题已经得到了很大的回答,但是回过头来看原始帖子,这是(IMHO)Swift中相对简洁的翻译。关键是您可以链接惰性属性。请注意,我同时使用了类函数和闭包- 两者都很好。

  • 问题内容: 我快速覆盖了其中的两个必需变量,这些变量通过使用引用进行初始化,因为这些变量用于实现协议,并且需要引用以使用其属性 现在的问题是,它给了我预期的错误 Swift的编译器执行四项有用的安全检查,以确保两阶段初始化完成且没有错误 安全检查1指定的初始化程序在将其委托给超类初始化程序之前,必须确保初始化其类引入的所有属性。 摘录自:苹果公司“ The Swift Programming La

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