Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.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 - Fatal编程技术网

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更可取。