如何从Python类中引用静态属性?

自由

我有以下python代码段:

class myClass:
    myVar = 'a'

    def __init__(self):
        self.myOtherVar = 'b'
        myVar = 'c'  # Gets assigned but only as a local variable.

    print myVar            # prints 'a' !
    print self.myOtherVar  # says 'self' not found

我的问题是这个;myVar从内部打印myClass和/或从中重新分配内容的正确方法是什么init

巴库留

您面临的问题是因为您不了解类声明的作用域。类声明在其自己的范围内执行执行完成后,将创建一个新的类对象,并将获得的范围作为类附加到该类__dict__

注意不能从方法范围内搜索类范围这意味着,你必须引用类的属性MyClass.attribute时,里面的方法定义。

例如:

class MyClass:
    var = 1

    # we are executing this code as a single block
    # so you must reference the variable as is usual
    print(var)

    # default values are *not* inside the definition.
    # they are evaluated in the outer scope, so use plain "var" here
    def method(self, a_default=var):
        print(a_default)

    def other_method(self):

        # inside methods you are in a different scope
        print(MyClass.var)

        # equivalent *if* no "var" instance attributes exists
        print(self.var)

注意:由于执行该类的声明时该类仍然不存在,因此无法MyClassMyClass声明的“顶层”进行引用

class MyClass:
    var = 1
    print(MyClass.var)   # error: MyClass still doesn't exist.

这样做的副作用是以下代码:

class MyClass:
    x = 1
    results = list(i+x for i in range(10))

产生:

NameError                                 Traceback (most recent call last)
<ipython-input-6-f1d4417b2e52> in <module>()
----> 1 class MyClass:
      2     x = 1
      3     results = list(i+x for i in range(10))
      4 

<ipython-input-6-f1d4417b2e52> in MyClass()
      1 class MyClass:
      2     x = 1
----> 3     results = list(i+x for i in range(10))
      4 

<ipython-input-6-f1d4417b2e52> in <genexpr>(.0)
      1 class MyClass:
      2     x = 1
----> 3     results = list(i+x for i in range(10))
      4 

NameError: name 'x' is not defined

因为生成器表达式(以及python3中的列表理解)实际上被认为是具有自己作用域的函数。由于未从内部函数范围中搜索类范围,x因此无法找到。

您可以使用函数定义和默认值对此加以说明:

class MyClass:
    x = 1
    def _make_results(x=x):
        return list(i+x for i in range(10))
    results = _make_results()
    del _make_results    # otherwise it would be added as a method.
    # or:
    results = (lambda x=x: list(i+x for i in range(10)))()

这通常不是问题,因为类定义很少包含除方法定义和一些常量以外的任何内容。


关于类范围,SO已经存在一些问题:

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Python的类中引用静态属性?

来自分类Dev

如何在 Python 中引用静态类变量?

来自分类Dev

如何在类静态成员中引用静态变量?

来自分类Dev

如何在静态类中绑定属性?

来自分类Dev

在Typescript中引用静态类

来自分类Dev

在Java中,如何显式引用“ this”类的静态成员?

来自分类Dev

如何在静态类方法中引用提供者?

来自分类Dev

在python类中引用整数作为静态变量

来自分类Dev

如何在Python中声明静态属性?

来自分类Dev

在静态类中设置属性

来自分类Dev

如何在PHP扩展类中设置静态类属性?

来自分类Dev

如何自引用Python中的类?

来自分类Dev

如何通过动态引用其静态变量来更改父类的属性?

来自分类Dev

如何将类方法分配给默认属性(即从静态范围引用非静态方法)

来自分类Dev

如何从XAML引用静态类字段

来自分类Dev

如何从类变量引用静态方法

来自分类Dev

Python类对象属性引用

来自分类Dev

别名本身中的完全静态类的引用

来自分类Dev

如何在python中通过引用调用静态方法

来自分类Dev

如何在Kotlin中获得对Java超类的静态类的引用

来自分类Dev

Python从类中引用类

来自分类Dev

在Android的静态类中引用非静态方法-getSharedPref

来自分类Dev

是否可以在静态类中引用方法而不引用该类?

来自分类Dev

如何在Python的类中模拟属性

来自分类Dev

Python 2.7:如何获取类中的静态变量列表?

来自分类Dev

如何在python中打印类的声明静态变量

来自分类Dev

如何动态获取静态类的属性的值?

来自分类Dev

如何动态获取静态类的属性的值?

来自分类Dev

如何影响具有静态属性的类

Related 相关文章

热门标签

归档