Python 访问对象中的类变量的最佳方法?
这两种方法都有效:Python 访问对象中的类变量的最佳方法?,python,Python,这两种方法都有效: class A: V = 3 def getV(self): return self.V def getVbis(self): return A.V print A().getV() print A().getVbis() 哪一个更像蟒蛇?为什么?self.V包含实例变量的值,而A.V包含类变量的值。根据您的类方法对V做了什么以及它们是如何做的,getV和getVbis将返回不同的内容 下面是一个例子: class
class A:
V = 3
def getV(self):
return self.V
def getVbis(self):
return A.V
print A().getV()
print A().getVbis()
哪一个更像蟒蛇?为什么?
self.V
包含实例变量的值,而A.V
包含类变量的值。根据您的类方法对V做了什么以及它们是如何做的,getV
和getVbis
将返回不同的内容
下面是一个例子:
class A:
V = 3
def getV(self):
return self.V
def getVbis(self):
return A.V
def setV(self, newVal):
self.V = newVal
aInst = A()
print aInst.getV()
print aInst.getVbis()
aInst.setV(5)
print aInst.getV()
print aInst.getVbis()
上述代码将导致以下结果:
3
3
5
3
所以我不认为这是关于哪个更像蟒蛇。更确切地说,它是关于您试图如何处理类变量。
self.V
包含实例变量的值,而A.V
包含类变量的值。根据您的类方法对V做了什么以及它们是如何做的,getV
和getVbis
将返回不同的内容
下面是一个例子:
class A:
V = 3
def getV(self):
return self.V
def getVbis(self):
return A.V
def setV(self, newVal):
self.V = newVal
aInst = A()
print aInst.getV()
print aInst.getVbis()
aInst.setV(5)
print aInst.getV()
print aInst.getVbis()
上述代码将导致以下结果:
3
3
5
3
所以我不认为这是关于哪个更像蟒蛇。更确切地说,它是关于你试图用你的类变量做什么。不管你的代码的实际意义如何,我认为getter/setter方法并不是那么pythonic 首先,该变量默认为public。getter函数使它更复杂 其次,如果您想在getter/setter func中有一些约束或其他逻辑,那么它应该有一个更明显的名称来指示逻辑。getXXX这个名字没有任何意义
顺便说一句,如果您真的不想直接访问变量,那么还有另一个选项:尽管您的代码有实际的含义,但我认为getter/setter方法并没有那么pythonic 首先,该变量默认为public。getter函数使它更复杂 其次,如果您想在getter/setter func中有一些约束或其他逻辑,那么它应该有一个更明显的名称来指示逻辑。getXXX这个名字没有任何意义
顺便说一句,如果您真的不想直接访问变量,还有另一个选项:我自己更喜欢在实例方法中作为实例方法访问类成员(属性和方法)。我不知道它是否更像python,但它允许我关注接口,因为我总是可以用实例成员重写类成员。本例中的类成员提供了一些有用的定义(值或实现)。我自己更喜欢在实例方法中作为实例方法访问类成员(属性和方法)。我不知道它是否更像python,但它允许我关注接口,因为我总是可以用实例成员重写类成员。本例中的类成员提供了一些有用的定义(值或实现)。它可能不漂亮,但我更喜欢:
self.__class__.V
这样,您就不必显式引用类名,这样子类化就更容易了,而且不会有意外获得实例属性而不是类属性的危险。这可能不太好看,但我更喜欢:
self.__class__.V
这样,您就不必显式引用类名,这样子类化就更容易了,而且不会有意外获得实例属性而不是类属性的危险。
getVbis()
没有错??两者都是不平等的,他们做不同的事情。您已经将V定义为类a的变量,而不是实例a的变量。它在所有类之间共享。但是,如果self没有属性V,那么尝试获取self.V将查找属于self类的属性V,这就是它们都工作的原因。但如果您多次实例化此项;在所有实例上,两个setter都将引用在类的所有实例之间共享的同一个对象-尽管这可能不会让您在这里绊倒,因为int是不可变的,赋值给self.V将创建一个实例属性。如果概念上希望V是实例的属性而不是类的属性,您应该在实例的\uuu init\uuuu
方法中执行self.V=3,而不是在类定义中执行V=3。getVbis()
没有错吗??两者都是不平等的,他们做不同的事情。您已经将V定义为类a的变量,而不是实例a的变量。它在所有类之间共享。但是,如果self没有属性V,那么尝试获取self.V将查找属于self类的属性V,这就是它们都工作的原因。但如果您多次实例化此项;在所有实例上,两个setter都将引用在类的所有实例之间共享的同一个对象-尽管这可能不会让您在这里绊倒,因为int是不可变的,赋值给self.V将创建一个实例属性。如果概念上希望V是实例的属性而不是类的属性,您应该在实例的\uuu init\uuu
方法中执行self.V=3,而不是在类定义中执行V=3。这只是一个示例。在我的真实代码中,我没有实现getter/setter。我只是在对象中使用类变量(对我来说是一个常量:我不改变它),我不确定self.V是否比a.V更可取。这只是一个例子。在我的真实代码中,我没有实现getter/setter。我只是在对象中使用类变量(对我来说是一个常量:我不改变它),我不确定self.V是否比a.V更可取。