Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中实例化静态变量_Python_Static_Readonly_Class Variables - Fatal编程技术网

在python中实例化静态变量

在python中实例化静态变量,python,static,readonly,class-variables,Python,Static,Readonly,Class Variables,我想在python中为一个类创建一个静态变量,并用相同的类型实例化它,即 class TestVarClass(): # this is my static variable here testVar = None def __init__(self, value): # instance variable here instanceVar = 0 # instantiating the static variable with its

我想在python中为一个类创建一个静态变量,并用相同的类型实例化它,即

class TestVarClass():
    # this is my static variable here
    testVar = None

    def __init__(self, value):
        # instance variable here
        instanceVar = 0

# instantiating the static variable with its own type
TestVarClass.testVar = TestVarClass(1)
由于python是一种解释语言,我无法在init之前实例化类中的静态对象。因此,我把它放在了课堂之外。但当我在pycharm中调试时,变量testVar带有无限嵌套,如下所示:

  • 这是什么意思?因为每个级别的地址都是相同的,所以 看起来不像是分配了很多次,但为什么呢 调试器是否显示如下值
  • 我基本上想要实现 在python中创建一个静态只读变量 在这里

  • 你为什么看到你所看到的?您已经创建了一个
    TestVarClass
    的实例,并将其分配给
    testVar
    class属性,该属性可以从该类及其每个实例访问(但仍然是相同的class属性并引用相同的对象)。这与以下简化示例相同:

    >>> class C:
    ...     pass
    ... 
    >>> C.a = C()
    >>> C.a
    <__main__.C instance at 0x7f14d6b936c8>
    >>> C.a.a
    <__main__.C instance at 0x7f14d6b936c8>
    
    我不完全确定你到底想要什么。一旦赋值,class属性就和类一起存在,因此在这方面可以认为是静态的。所以我想你只对一次行为感兴趣?或者在实例中公开class属性,而不能将实例本身分配给它?例如:

    >>> class C:
    ...     _a = None
    ...     @property
    ...     def a(self):
    ...         return self._a
    ... 
    >>> C._a = C()
    >>> c = C()
    >>> print(c.a)
    <__main__.C object at 0x7f454bccda10>
    >>> c.a = 'new'
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: can't set attribute
    

    本质上,只读变量(静态或非静态)听起来已经有点像Adiector中的矛盾(实际上没有那么多变量),但(长话短说)我想问题是,在上下文中,您试图做什么(您试图解决的问题)。。。也许基于此,我们可以尝试用Python来表达这个想法,但是在没有进一步限定的情况下,Python没有任何可以称之为静态只读变量的东西。

    为什么会看到您看到的东西?您已经创建了一个
    TestVarClass
    的实例,并将其分配给
    testVar
    class属性,该属性可以从该类及其每个实例访问(但仍然是相同的class属性并引用相同的对象)。这与以下简化示例相同:

    >>> class C:
    ...     pass
    ... 
    >>> C.a = C()
    >>> C.a
    <__main__.C instance at 0x7f14d6b936c8>
    >>> C.a.a
    <__main__.C instance at 0x7f14d6b936c8>
    
    我不完全确定你到底想要什么。一旦赋值,class属性就和类一起存在,因此在这方面可以认为是静态的。所以我想你只对一次行为感兴趣?或者在实例中公开class属性,而不能将实例本身分配给它?例如:

    >>> class C:
    ...     _a = None
    ...     @property
    ...     def a(self):
    ...         return self._a
    ... 
    >>> C._a = C()
    >>> c = C()
    >>> print(c.a)
    <__main__.C object at 0x7f454bccda10>
    >>> c.a = 'new'
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: can't set attribute
    

    本质上,只读变量(静态或非静态)听起来已经有点像Adiector中的矛盾(实际上没有那么多变量),但(长话短说)我想问题是,在上下文中,您试图做什么(您试图解决的问题)。。。也许基于此,我们可以尝试用Python来表达这个想法,但在没有进一步限定的情况下,Python没有任何可以称之为静态只读变量的东西。

    我不知道为什么调试器会这样显示,但是这里有一个关于python中静态/只读变量的有用注释:如果静态变量可以被实例化为除类类型“What does this means?”之外的任何类型,那么您给出的链接中提到的方法将很好地工作。您已经创建了
    TestVarClass
    的一个实例,并将其分配给
    testVar
    class属性(指所述类),可从该类及其每个实例访问(但仍然是相同的类属性并引用相同的对象)@ondrej,是的,但为什么屏幕截图中的级别如此?我只创建了一个实例,所以它不应该多次显示嵌套?我不知道为什么调试器会显示嵌套,但这里有一个关于python中静态/只读变量的有用注释:如果静态变量可以为除了类类型“这意味着什么?”之外的任何类型,您已经创建了
    TestVarClass
    的一个实例,并将其分配给
    testVar
    类属性(所述类的),该属性可以从该类及其每个实例访问(但仍然是相同的类属性并引用相同的对象)@ondrej,是的,但是为什么屏幕截图中有这么多级别?我只创建了一个实例,所以它不应该多次显示嵌套?感谢ondrej的回答。我正试图将一些C#代码转换为python,并且需要创建一个可以作为静态且只读的变量。如果在python中没有实现这一点的方法,我在代码中创建testVar的方式可以让变量以静态方式运行。如前所述,Python中没有使用相同的构造(甚至写保护类属性的想法也不容易实现),代码的1:1转换实际上不是一个选项(或者不是一个实用的选项),但最后的问题是什么行为对每个用例真正重要,以及(如何)我能用我正在使用的语言来表达这一点吗?谢谢Ondrej的回答。我试图将一些C#代码转换为python,并且面临着创建一个可以表现为静态且只读的变量的需要。如果在python中没有实现这一点的方法,那么我在代码中创建testVar的方法可以让该变量在stati中表现如前所述,Python中没有使用相同的构造(甚至写保护类属性的概念也不容易实现),代码的1:1转换不是一个真正的选项(或者不是一个实用的选项),但最终的问题是,对于每个用例来说,什么样的行为才是真正重要的,以及(如何实现)我可以用我正在使用的语言来表达吗。