zoukankan      html  css  js  c++  java
  • Python 学习笔记

    定义

    Python 的 Class 比较特别,和我们习惯的静态语言类型定义有很大区别。

    1. 使用一个名为 __init__ 的方法来完成初始化。
    2. 使用一个名为 __del__ 的方法来完成类似析购操作。
    3. 所有的实例方法都拥有一个 self 参数来传递当前实例,类似于 this。
    4. 可以使用 __class__ 来访问类型成员

    >>>>>> class MyClass: 
    def __init__(self): 
    print "initialize." 
    def Foo(self): 
    print id(self) 

    >>>>>> a = MyClass() 
    initialize
    >>>>>> a.Foo() 
    14412576 
    >>>>>> id(a) 
    14412576
     

    Class 有一些特殊的属性,便于我们获得一些额外的信息。

    >>>>>> class MyClass(object): 
    """This is MyClass's Docoment""" 
    def __init__(self): 
    self.i = 1234 
    >>>>>> MyClass.__doc__ # 类型帮助信息 
    "This is MyClass's Docoment""This is MyClass's Docoment" 
    >>>>>> MyClass.__name__ # 类型名称 
    'MyClass' 
    >>>>>> MyClass.__module__ # 类型所在模块 
    '__main__' 
    >>>>>> MyClass.__bases__ # 类型所继承的基类(Python 支持多继承) 
    (<type 'object'>,) 
    >>>>>> MyClass.__dict__ # 类型字典,存储所有类型成员信息 
    <dictproxy object at 0x00DC1AD0> 
    >>>>>> #以下是实例拥有的属性 
    >>>>>> MyClass().__class__ # 实例的类型 
    <class '__main__.MyClass'> 
    >>>>>> MyClass().__module__ # 实例类型所在模块 
    '__main__' 
    >>>>>> MyClass().__dict__ # 对象字典,存储所有实例成员信息 
    {'i': 1234} 
    >>>>>>
     

     

    继承


    Python 支持多继承,但有几点需要注意:

    1. 基类 __init__ / __del__ 需显示调用。
    2. 继承方法的调用和基类声明顺序有关。

    >>>>>> class Base1: 
    def __init__(self): 
    print "Base1" 
    def test(self): 
    print "Base1 test


    >>>>>> class Base2: 
    def __init__(self): 
    print "Base2" 
    def test(self): 
    print "Base2 test

    >>>>>> class MyClass(Base2,Base1): 
    def __init__(self): 
    Base1.__init__(self) 
    Base2.__init__(self) 
    print "MyClass" 
    >>>>>> a = MyClass() 
    Base1 
    Base2 
    MyClass 
    >>>>>> a.test() 
    Base2 test 
    >>>>>> # 下面把 Base1 放在前面 
    >>>>>> class MyClass(Base1,Base2): 
    def __init__(self): 
    Base1.__init__(self) 
    Base2.__init__(self) 
    print "MyClass" 
    >>>>>> a = MyClass() 
    Base1 
    Base2 
    MyClass 
    >>>>>> a.test() 
    Base1 test 
    >>>>>>
     

    成员

    Python Class 同样包含类型和实例两种成员。

    >>>>>> class Class1: 
    i = 123 # 类成员 
    def __init__(self): 
    self.i = 100 # 实例成员 


    >>>>>> print Class1.i 
    123 
    >>>>>> print Class1().i 
    100 
    >>>>>>
     

    有几个很 "特殊" 的 "规则" 需要注意。

    (1) 我们可以通过实例引用访问类型成员。因此下面的例子中 self.i 实际指向 Class1.i,直到我们为实例新增了一个成员 i。
    >>>>>> class Class1: 
    i = 123 
    def __init__(self): 
    print self.i 
    print hex(id(self.i)) 

    >>>>>> hex(id(Class1.i)) # 显示 Class1.i 的地址 
    '0xab5860' 
    >>>>>> a = Class1() # 创建 Class1 实例,我们会发现 self.i 实际指向 Class1.i 
    123 
    0xab5860 
    >>>>>> Class1.__dict__ # 显示 Class1 成员 
    {'i': 123, '__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x012911B0>} 
    >>>>>> a.__dict__ # 显示实例成员 
    {} 
    >>>>>> a.i = 100 # 为实例新增加一个成员i 
    >>>>>> hex(id(a.i)) # 显示新成员i的地址 
    '0xab5974' 
    >>>>>> a.__dict__ # 显示实例成员 
    {'i': 100} 
    >>>>>>

    (2) 调用类型内部方法,需要省略 self 参数。

    >>>>>> class Class1: 
    def __init__(self): 
    self.__test("Hello Python") 
    def __test(self, s): 
    print s 
    >>>>>> Class1() 
    Hello Python 
    <__main__.Class1 instance at 0x00DC3800> 
    >>>>>>

    我们可以在成员名称前添加 "__" 使其成为私有成员。

    >>>>>> class Class1: 
    __i = 123 
    def __init__(self): 
    self.__x = 0 
    def __test(self): 
    print id(self) 
    >>>>>> Class1.i 

    Traceback (most recent call last): 
    File "<pyshell#203>", line 1, in <module> 
    Class1.i 
    AttributeError: class Class1 has no attribute 'i' 
    >>>>>> Class1().__x 

    Traceback (most recent call last): 
    File "<pyshell#204>", line 1, in <module> 
    Class1().__x 
    AttributeError: Class1 instance has no attribute '__x' 
    >>>>>> Class1().__test() 

    Traceback (most recent call last): 
    File "<pyshell#205>", line 1, in <module> 
    Class1().__test() 
    AttributeError: Class1 instance has no attribute '__test' 
    >>>>>>

    事实上这只是一种规则,并不是编译器上的限制。我们依然可以用特殊的语法来访问私有成员。

    >>>>>> Class1._Class1__i 
    123 
    >>>>>> a = Class1() 
    >>>>>> a._Class1__x 

    >>>>>> a._Class1__test() 
    14432256 
    >>>>>>

    除了静态(类型)字段,我们还可以定义静态方法。

    >>>>>> class Class1: 
    @staticmethod 
    def test(): 
    print "In Static method
    >>>>>> Class1.test() 
    In Static method 
    >>>>>>

    从设计的角度,或许更希望用属性(property)来代替字段(field)。

    >>>>>> class Class1: 
    def __init__(self): 
    self.__i = 1234 
    def getI(self): return self.__i 
    def setI(self, value): self.__i = value 
    def delI(self): del self.__i 
    I = property(getI, setI, delI, "Property I") 

    >>>>>> a = Class1() 
    >>>>>> a.I 
    1234 
    >>>>>> a.I = 1000 
    >>>>>> a.I 
    1000 

    如果只是 readonly property,还可以用另外一种方式。

    >>>>>> class Class1: 
    def __init__(self): 
    self.__i = 1234 
    @property 
    def I(self): 
    return self.__i 
    >>>>>> a = Class1() 
    >>>>>> a.I 
    1234 

    用 __getitem__ 和 __setitem__ 可以实现 C# 索引器的功能。

    >>>>>> class Class1: 
    def __init__(self): 
    self.__x = ["a", "b", "c"] 
    def __getitem__(self, key): 
    return self.__x[key] 
    def __setitem__(self, key, value): 
    self.__x[key] = value 

    >>>>>> a = Class1() 
    >>>>>> a[1] 
    'b' 
    >>>>>> a[1] = "xxx" 
    >>>>>> a[1] 
    'xxx' 
    >>>>>>
     

    转自 http://blog.chinaunix.net/uid-15007890-id-106945.html

  • 相关阅读:
    在没有源代码的情况下调试JAR包..
    Flex游戏篇——游戏开发概述
    CSDN、sina博客在Zoundry中登记的API URL 收藏
    标准博客 API .BLOG APIS
    SAXParseException An invalid XML character 问题的解决
    分布式存储方法
    拨号720错误解决记.txt
    xxx
    硬盘分区后的逻辑结构
    paip sms to blog.txt
  • 原文地址:https://www.cnblogs.com/perfei/p/5385884.html
Copyright © 2011-2022 走看看