zoukankan      html  css  js  c++  java
  • python面向对象编程(2)—— 实例属性,类属性,类方法,静态方法

    1  实例属性和类属性

    类和实例都是名字空间,类是类属性的名字空间,实例则是实例属性的名字空间。

    类属性可通过类或实例来访问。只有通过类名访问时,才能修改类属性的值。

    例外的一种情况是,当类属性是一个可变对象时(比如一个字典),这时,通过它的实例是可以修改类的这个可变属性的。

    当类属性被修改时,会影响到所有的实例,包括修改之前和之后创建的实例。


    2  绑定和方法调用

    方法是类属性而不是实例属性。

    方法只有当类拥有实例时,才能被调用。

    任何一个方法定义中的第一个参数都是变量self,它表示调用此方法的实例对象。


    3 静态方法和类方法

    类方法和通常的方法不同的是,它需要类而不是实例作为第一个参数传递给它,通常使用cls作为传递的变量名。



    使用函数修饰符对上面的代码进行重写:

    class TestStaticMethod:
        @staticmethod
        def foo():
            print 'calling static method foo()'
    
    class TestClassMethod:
        @classmethod
        def foo(cls):
            print 'calling class method foo()'
            print 'foo() is part of class:', cls.__name__

    4 组合

    一个类中包含其他类的实例,反应的是“has-a / 有一个”的关系。


    5 子类和派生



    需要注意的是,文档字符串对类,函数/方法,模块来说,都是唯一的,所以特殊属性__doc__不会从基类中继承过来。


    __bases__类属性:对于任何子类,它是一个包含其父类的集合的元组。(直接继承的父类,不包括传递继承关系的父类)


    覆盖父类方法后,想要在子类中调用父类中被覆盖的方法,可以通过如下的方式:

    # 1
    Parent.foo(c)  # c is an instance of Child
    
    # 2
    class Child(P):
        def foo(self):
            P.foo(self)
            pirnt 'Hi, I an Child-foo()'
    
    # 3 super()内建方法, super()找到基类方法,并且传递self参数。
    class Child(Parent):
        def foo(self):
            super(Child, self).foo()
            print 'Hi, I am C-foo()'

    注意:在子类中重写__init__不会自动调用基类的__init__,这点和Java有很大的区别。





  • 相关阅读:
    Maven 配置篇之 pom.xml
    Maven 配置篇之 pom.xml
    Building Seam 2.0 Application with NetBeans 6.1(Maven2)
    TestNG 使 Java 单元测试轻而易举
    文本加密和解密
    DLL/OCX中的MFC对话框不能处理Tab和回车键的问题 .
    如何在编辑框中使用IAutoComplete接口
    演练:创建和使用静态库 (C++)
    MFC Activex OCX Javascript 互相访问问题,线程回调javascript
    VC++学习方法及书籍推荐 .
  • 原文地址:https://www.cnblogs.com/suzhou/p/3638978.html
Copyright © 2011-2022 走看看