Python入门篇之面向对象(6)
>>> c = C()
>>> C.version
2
>>> c.version
2
>>> C.version += 2
>>> C.version
4
>>> c.version
4
从实例中访问类属性须谨慎
与通常 Python 变量一样,任何对实例属性的赋值都会创建一个实例属性(如果不存在的话)并且对其赋值。如果类属性中存在同名的属性,副作用即产生。
>>> class Foo(object):
x = 1
>>> foo =Foo()
>>> foo.x
1
>>> foo.x = 2
>>> Foo.x
1
使用del后
>>> del foo.x
>>> foo.x
1
静态成员,如其名所言,任凭整个实例(及其属性)的如何进展,它都不理不采(因此独立于实例)。同时,当一个实例在类属性被修改后才创建,那么更新的值就将生效。类属性的修改会影响到所有的实例:
>>> class C(object):
spam = 11
>>> c1 = C()
>>> c1.spam
11
>>> C.spam += 2
>>> C.spam
13
>>> c1.spam
13
>>> c2 = C()
>>> c2.spam
13
>>> del c1
>>> C.spam += 3
>>> c2.spam
16
正如上面所看到的那样,使用实例属性来试着修改类属性是很危险的。原因在于实例拥有它们自已的属性集,在 Python 中没有明确的方法来指示你想要修改同名的类属性,修改类属性需要使用类名,而不是实例名。
静态方法和类方法
静态方法和类方法在 Python2.2 中引入。经典类及新式(new-style)类中都可以使用它。一对内建函数被引入,用于将作为类定义的一部分的某一方法声明“标记”(tag),“强制类型转换”(cast)或者“转换”(convert)为这两种类型的方法之一。
现在让我们看一下在经典类中创建静态方法和类方法的一些例子:
>>> class TestStaticMethod:
def foo():
print 'calling static method foo()'
foo = staticmethod(foo)
>>> class TestClassMethod:
def foo(cls):
print 'calling class method foo()'
print 'foo() is part of class:', cls.__name__
foo = classmethod(foo)
对应的内建函数被转换成它们相应的类型,并且重新赋值给了相同的变量名。如果没有调用这两个函数,二者都会在 Python 编译器中产生错误,显示需要带 self 的常规方法声明。
>>> tsm = TestStaticMethod()
>>> TestStaticMethod.foo()
calling static method foo()
>>> tsm.foo()
calling static method foo()
>>> tcm = TestClassMethod()
>>> TestClassMethod.foo()
calling class method foo()
foo() is part of class: TestClassMethod
>>> tcm.foo()
calling class method foo()
foo() is part of class: TestClassMethod
使用函数修饰符:
在 Python2.4 中加入的新特征。你可以用它把一个函数应用到另个函数对象上, 而且新函数对象依然绑定在原来的变量。我们正是需要它来整理语法。通过使用 decorators,我们可以避免像上面那样的重新赋值:
>>> class TestStaticMethod:
@staticmethod
def foo():
print 'calling static method foo()'
- 上一篇:python3生成随机数实例
- 下一篇:Python入门篇之数字