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

在Python中访问类的成员变量?

沈长恨
2023-03-14
问题内容
class Example(object):
    def the_example(self):
        itsProblem = "problem"

theExample = Example()
print(theExample.itsProblem)

如何访问类的变量?我尝试添加此定义:

def return_itsProblem(self):
    return itsProblem

但是,这也失败了。


问题答案:

简而言之,答案

在您的示例中,itsProblem是一个局部变量。

您必须使用self设置和获取实例变量。您可以在__init__方法中进行设置。那么您的代码将是:

class Example(object):
    def __init__(self):
        self.itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)

但是,如果您想要一个真正的类变量,则直接使用类名:

class Example(object):
    itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)
print (Example.itsProblem)

但是要小心这一点,因为theExample.itsProblem它会自动设置为Example.itsProblem,但根本不是同一变量,可以独立更改。

一些解释

在Python中,可以动态创建变量。因此,您可以执行以下操作:

class Example(object):
    pass

Example.itsProblem = "problem"

e = Example()
e.itsSecondProblem = "problem"

print Example.itsProblem == e.itsSecondProblem

版画

真正

因此,这正是您使用前面的示例所做的。

的确,在Python中我们使用selfas
this,但还不止于此。self是任何对象方法的第一个参数,因为第一个参数始终是对象引用。无论您是否调用,这都是自动的self

这意味着您可以:

class Example(object):
    def __init__(self):
        self.itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)

要么:

class Example(object):
    def __init__(my_super_self):
        my_super_self.itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)

完全一样。 _ANY对象方法的第一个参数是当前对象,我们仅将其self称为约定。_然后,您只需要向该对象添加一个变量即可,就像从外部执行该操作一样。

现在,关于类变量。

当您这样做时:

class Example(object):
    itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)

您会注意到我们首先 设置一个类变量 ,然后访问 一个对象(实例)变量 。我们从来没有设置这个对象变量,但是它起作用了,那怎么可能呢?

好吧,Python尝试首先获取对象变量,但是如果找不到它,则会为您提供类变量。 警告:在实例之间共享类变量,而在对象变量之间不共享。

结论是,切勿使用类变量将默认值设置为对象变量。使用__init__了点。

最终,您将了解到Python类是实例,因此是对象本身,这为理解上述内容提供了新的见解。一旦意识到这一点,请稍后再阅读。



 类似资料:
  • 问题内容: 我有一些用Java编写的代码。对于新课程,我计划在Scala中编写。我在访问基类的受保护静态成员时遇到问题。这是示例代码: Java代码: 标量代码: 有什么建议吗?我如何在不修改现有基类的情况下解决这个问题 问题答案: 这在Scala中是不可能的。由于Scala没有记号,您不能访问父类的成员。这是一个已知的限制。 解决方法是执行以下操作: 现在,您可以改为从这个新类继承,并通过get

  • 我正在使用nashorn引擎,我正在尝试扩展以下java类 Javascript代码:在init()方法中,我想访问超类成员(直接设置受保护字段的值或使用公共setter) 在java中,我创建对象实例并调用init方法,但字段“name”为空。 我还尝试使用Java.super(扩展). setName("name");但这抛出了一个异常

  • 问题内容: 我有这个: 我如何才能实际修改全局变量g_c? 问题答案: 通过在访问它的函数中声明它: 在Python文档说这个,有关声明: 全局语句是一个声明,适用于整个当前代码块。

  • 问题内容: 得知子类的类变量无法访问父类的类变量而没有特别指出父类的名称,我感到很惊讶: 为什么在定义By时我必须引用Ax,而不仅仅是x?这与我对实例变量的直觉是相反的,并且因为在定义B之后我可以引用Bx。 问题答案: 在Python中,在创建类之前,将在其自己的名称空间中执行类的主体(此后,该名称空间的成员将成为该类的成员)。因此,当解释器达到y = x + 1时,此时B类尚不存在,因此没有父类

  • 类的数据成员(类定义中声明的变量)和成员函数(类定义中声明的函数)属于该类的类范围(class's scope)。非成员函数在文件范围(file scope)中定义。 在类范围中,类成员可由该类的所有成员函数直接访问,也可以用名称引用。在类范围外,类成员是通过一个对象的句柄引用,可以是对象名、对象引用或对象指针(第7章将介绍,每次引用对象中的数据成员和成员函数时,编译器插入一个隐式句柄)。 类的成

  • 最近在review代码的时候发现,使用了空指针调用成员函数,并且成员函数内部有使用到成员变量,居然没有出错。很是奇怪,就用一篇博客把关于空指针调用成员函数相关的内容总结起来。 空指针调用成员函数 调用普通成员函数 如果空指针调用普通成员函数,看该函数体中是否使用到了this指针(是否访问非静态成员变量)。如果使用到了this指针,程序会崩溃;如果没有使用到this指针,程序不会崩溃。当然,如果访问

  • 通过下列任意一个方法访问成员变量时将返回 Field 类型的对象或数组。 getFields() getField(String name) getDeclaredFields() getDeclaredField(String name) 上述方法返回的 Field 对象代表一个成员变量。例如,要访问一个名称为 price 的成员变量,示例代码如下: Field 类的常用方法如表 1 所示 表1