Python:属性的显式声明';静态 我来自C++和java环境,刚刚开始学习Python,因此这个问题。这里有一句话:
显式比隐式好 那么,有没有一种方法可以在Python中同时显式声明静态和/或非静态属性 例如(不完全是python代码): 虽然Python中不存在“static”和“non_static”关键字,但这是我想要实现的行为: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属性是“非静态”的,因此应该可以
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属性查找要经过以下步骤;如果一个步骤成功,则确定结果,并跳过后续步骤:
\uuuu dict\uuu
名称空间,请检查其中的属性\uuu getattr\uuu
方法,则会调用它以查看它是否可以提供结果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