龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > python编程 >

Python入门篇之面向对象(6)

时间:2014-10-21 11:47来源:网络整理 作者:网络 点击:
分享到:
c = C() C.version 2 c.version 2 C.version += 2 C.version 4 c.version 4 从实例中访问类属性须谨慎 与通常 Python 变量一样,任何对实例属性的赋值都会创建一个实例属性(

>>> 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()'

精彩图集

赞助商链接