Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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:属性的显式声明';静态 我来自C++和java环境,刚刚开始学习Python,因此这个问题。这里有一句话:_Python_Python 3.x - Fatal编程技术网

Python:属性的显式声明';静态 我来自C++和java环境,刚刚开始学习Python,因此这个问题。这里有一句话:

Python:属性的显式声明';静态 我来自C++和java环境,刚刚开始学习Python,因此这个问题。这里有一句话:,python,python-3.x,Python,Python 3.x,显式比隐式好 那么,有没有一种方法可以在Python中同时显式声明静态和/或非静态属性 例如(不完全是python代码): 虽然Python中不存在“static”和“non_static”关键字,但这是我想要实现的行为: x属性应该可以通过BasicClass.x以及a.x和b.x访问。都是不同的实例 由于y属性是“静态”的,因此它应该仅由BasicClass实例拥有(并通过该实例访问)。 例如,如果将a.y用作对BasicClass.y的引用,就可以了 z属性是“非静态”的,因此应该可以

显式比隐式好

那么,有没有一种方法可以在Python中同时显式声明静态和/或非静态属性

例如(不完全是python代码):

虽然Python中不存在“static”和“non_static”关键字,但这是我想要实现的行为:

  • x
    属性应该可以通过
    BasicClass.x
    以及
    a.x
    b.x
    访问。都是不同的实例
  • 由于
    y
    属性是“静态”的,因此它应该仅由
    BasicClass
    实例拥有(并通过该实例访问)。
    • 例如,如果将
      a.y
      用作对
      BasicClass.y
      的引用,就可以了
  • z
    属性是“非静态”的,因此应该可以通过
    a.z
    b.z
    访问,这两个属性都是不同的实例,并且不能通过
    BasicClass
    直接访问,因为它不能具有此属性
  • 我认为第一个想要的行为就是真正发生的事情

    关于第二个,很清楚为什么像
    y
    这样的属性是重要的和需要的

    关于tird,我知道可以在类的方法中声明这样的属性。但是它能同时声明吗?如果没有,原因是什么?如果不是,这样更好吗


    显式声明
    \uuuu init\uuuuu(self,…):
    函数中的所有内容可能是一个问题,因为我希望属性不被初始化。或者这是一个来自C++/java的偏见吗?< /p> < p> Python没有“静态”属性的概念,而不是C++定义的属性。 相反,在instance上的Python属性查找要经过以下步骤;如果一个步骤成功,则确定结果,并跳过后续步骤:

  • 检查类(包括完整的MRO层次结构)上是否存在错误。这些属性的优先级高于实例属性。将绑定描述符并返回绑定结果。例如a
  • 如果实例有自己的
    \uuuu dict\uuu
    名称空间,请检查其中的属性
  • 检查类层次结构上的属性(如果不是数据描述符,步骤1将缓存该属性)。如果它是一个描述符,则绑定它,例如,在此阶段绑定一个函数以生成一个方法
  • 如果类层次结构定义了
    \uuu getattr\uuu
    方法,则会调用它以查看它是否可以提供结果
  • 就这样,;实例和类最基本的是一个分层的名称空间。属性没有声明,它们的存在是因为它们只是简单地被使用

    您可以使用来帮助IDE和静态类型验证器等工具检查类型正确性,并且可以使用这些提示来声明您的类将使用特定类型的实例属性,例如:

    from typing import ClassVar
    
    class BasicClass:
        x: int = 0            # instance and class attribute, with a default value for the class
        y: ClassVar[int] = 10 # explicitly a class attribute
        z: int                # instance attribute
    
        def __init__(self, x: int, z: int) -> None:
            self.x = x
            self.z = z
    
    但是Python运行时不会强制执行关于哪些属性可以在何处设置的任何规则。但是,当您在
    BasicClass
    实例上设置
    y
    的代码上运行静态类型检查器时,它会引发错误:

    $ tail -n 2 thdemo.py  # two lines added to the above example
    a = BasicClass(42, 81)
    a.y = 117
    $ mypy thdemo.py
    thdemo.py:14: error: Cannot assign to class variable "y" via instance
    

    如果您没有使用类型暗示,那么您永远不必“声明”属性。属性只是“是”,你可以使用它们,也可以不使用。Python假设我们都是成年人,可以在认为必要的地方编写单元测试,否则几乎完全是动态的。这给了你很大的灵活性和力量去做那些在C++或java中更难做的事情,而且更冗长。

    < Python很简单,不需要一个静态关键字。 类声明中指定的变量是类变量或静态变量,而类方法中的变量是实例变量

    class Employee:
       empName = 'Vicky' #class variable
    
       def __init__(self, age, id):
            self.age = age                #instance variable
            self.id = id                  #instance variable
    
    one = Employee(21, 1)
    two = Employee(30, 2)
    
    print(one.empName) # prints "Vicky"
    print(one.age) # prints 21
    

    Python的模型有很大的不同,在C++中没有等效的“静态”。类主体定义中的所有内容都是“静态的”。也许您实际上在寻找
    class Employee:
       empName = 'Vicky' #class variable
    
       def __init__(self, age, id):
            self.age = age                #instance variable
            self.id = id                  #instance variable
    
    one = Employee(21, 1)
    two = Employee(30, 2)
    
    print(one.empName) # prints "Vicky"
    print(one.age) # prints 21