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
谁能告诉我,为什么这是可能的,什么是好?这不是矛盾定义一个类为蓝图,如果我能在一个类中从外部改变也许关键值,并为这难道不是OOP
的encapsulation
paradigam的冲突。从.NET
即将其实我只知道通过一个getter和setter,但不只是这样的变量的访问。所以我很好奇,是什么重要的目的可以有,这是允许的。
为什么这可能吗? 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
(编辑:增加了一些更多的代码,以更好地展示使用)
此外,在你的代码,你也修改类的定义之后,所作的修改具有追溯(排序)的影响。这通常称为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
但是,这肯定不是一个鼓励的编程风格,如果清洁剂可供选择。