为什么是一个类变量从外部接近

问题描述 投票:-2回答:1

Python入门我只是遇到了一些我真的不明白。让我们看看这个例子:

class CV_Test:
    classVar = 'First'

cv = CV_Test()
print(cv.classVar)
CV_Test.classVar = 'Second'
cv2 = CV_Test()
print(cv2.classVar)
print(CV_Test.classVar)

输出:

First
Second
Second

谁能告诉我,为什么这是可能的,什么是好?这不是矛盾定义一个类为蓝图,如果我能在一个类中从外部改变也许关键值,并为这难道不是OOPencapsulation paradigam的冲突。从.NET即将其实我只知道通过一个getter和setter,但不只是这样的变量的访问。所以我很好奇,是什么重要的目的可以有,这是允许的。

python oop encapsulation
1个回答
1
投票

为什么这可能吗? Python不遵循严格的编程范式,这意味着,如果事情可以在某些情况下是有意义的,解释不应该在程序员愿意这样做的方式站立。

话虽这么说,这种方法需要纪律和程序员的侧责任的较高水平,但也允许灵活的元编程功能,更大程度。

那么,到底这是一个设计选择。它的好处是,你并不需要显式地去使用getter / setter方法。

对于受保护的/私有成员/方法,习惯上在前面加上___,分别。此外,人们将能够伪造吸气/设定器保护的行为(其也将允许额外的代码的执行)通过方法装饰@property@.setter,例如:

class MyClass():
    _an_attribute = False

    @property
    def an_attribute(self):
        return self._an_attribute

    @an_attribute.setter
    def an_attribute(self, value):
        self._an_attribute = value

这可以像这样使用:

x = MyClass()

x.an_attribute
# False

x.an_attribute = 1
# sets the internal `_an_attribute` to 1.

x.an_attribute
# 1

你可以离开了@an_attribute.setter一部分,如果你想有一个只读(排序)属性,因此下面的代码:

x = MyClass()

x.an_attribute
# False

但是,试图改变其值将导致:

x.an_attribute = 1

AttributeError的:不能设置属性

当然,你仍然可以这样做:

x._an_attribute = 2

x.an_attribute
# 2

(编辑:增加了一些更多的代码,以更好地展示使用)

EDIT: On monkey patching

此外,在你的代码,你也修改类的定义之后,所作的修改具有追溯(排序)的影响。这通常称为monkey patching和要触发某种行为在一些代码部分,同时保持其大部分的逻辑,e.g可以再次在某些情况下非常有用:

class Number():
    value = '0'

    def numerify(self):
        return float(self.value)

x = Number()
x.numerify()
# 0.0

Number.numerify = lambda self: int(self.value)
x.numerify()
# 0

但是,这肯定不是一个鼓励的编程风格,如果清洁剂可供选择。

© www.soinside.com 2019 - 2024. All rights reserved.