介绍

构造函数

__init__

析构函数

__del__

对象自己self

例子

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

成员__dict__

>>> MyClass().__dict__ # 
'__main__'  

所在模块__module__

>>>>>> MyClass().__module__ # 实例类型所在模块 
'__main__'  

实例的类型__class__

MyClass().__class__
<class '__main__.MyClass'> 

基类__bases__

>>> MyClass.__bases__ # 类型所继承的基类(Python支持多继承) 
(<type 'object'>,) 

继承

Python 支持多继承
基类 __init__() / __del__() 需显示调用
继承方法的调用和基类声明顺序有关

多重继承

python中允许多重继承
多个父类以,分隔符即可
class DerivedClass(BaseClass_A, BaseClass_AB)这样

1#-*- coding:utf-8 -*-
2
3class BaseClass_A:
4    name = "BaseClass_A"
5    def set_val(self, v):
6        self.val = v
7    def set_name(self, n):
8        self.name = n
9    def info(self):
10        print("Name: %s, Value: %s" % (BaseClass_A.name, self.val))
11
12
13class BaseClass_B:
14    name = "BaseClass_B"
15    def set_name(self, n):
16        self.name = n
17    def info(self):
18        print("Name: %s, Value: %s" % (BaseClass_B.name, self.val))
19        
20class subClassA(BaseClass_A, BaseClass_B):
21    def info(self):
22        _super.info()
23        BaseClass_B.info()
24
25if __name__ == "__main__":
26    obj1 = subClassA()
27    obj1.info()
#-*- coding:utf-8 -*-



class BaseClass_A:

    name = "BaseClass_A"

    def set_val(self, v):

        self.val = v

    def set_name(self, n):

        self.name = n

    def info(self):

        print("Name: %s, Value: %s" % (BaseClass_A.name, self.val))





class BaseClass_B:

    name = "BaseClass_B"

    def set_name(self, n):

        self.name = n

    def info(self):

        print("Name: %s, Value: %s" % (BaseClass_B.name, self.val))

        

class subClassA(BaseClass_A, BaseClass_B):

    def info(self):

        _super.info()

        BaseClass_B.info()



if __name__ == "__main__":

    obj1 = subClassA()

    obj1.info()

__metaclass__属性

可以在定义类的时候为其添加__metaclass__属性
如果你这么做了,Python就会用指定的元类来创建类
首先写下class Foo(object),但是类对象Foo还没有在内存中创建
Python会在类的定义中寻找__metaclass__属性
如果找到了,Python就会用它来创建类Foo
如果没有找到,那么会在父类中找
如果找到了就用父类来构造
如果所有的父类都没有, 就会用内建的type来创建这个类

特殊方法

Python 除了拥有实例方法外,还拥有静态方法和类方法
分别用@classmethod和@staticmethod来修饰

1#-*- coding:utf-8 -*-
2
3class Foo(object):
4    def test(self):   # instance method,必须有self来表示该实例
5        print "  Instance method is running"
6        print "    self:", self
7    @classmethod
8    def test2(cls):  # class method,注意需要cls这个参数,表示Foo这个类
9        print "  Class method is running"
10        print "    cls:", cls
11        print "    Class Type:", type(cls)
12    @staticmethod
13    def test3():      # static method
14        print "  Static method is running"
15
16
17if __name__ == "__main__":
18    # create an instance
19    o1 = Foo()
20
21    # use instance method,注意第二种写法,o1就是self
22    o1.test()       #
23    Foo.test(o1)    #
24
25    # use class method
26    Foo.test2()
27
28    # use static method
29    Foo.test3()
30
#-*- coding:utf-8 -*-



class Foo(object):

    def test(self):   # instance method,必须有self来表示该实例

        print "  Instance method is running"

        print "    self:", self

    @classmethod

    def test2(cls):  # class method,注意需要cls这个参数,表示Foo这个类

        print "  Class method is running"

        print "    cls:", cls

        print "    Class Type:", type(cls)

    @staticmethod

    def test3():      # static method

        print "  Static method is running"





if __name__ == "__main__":

    # create an instance

    o1 = Foo()



    # use instance method,注意第二种写法,o1就是self

    o1.test()       #

    Foo.test(o1)    #



    # use class method

    Foo.test2()



    # use static method

    Foo.test3()


D:\httpHome\docs\python\code\class>python classMethodTypesDemo1.py
  Instance method is running
    self: <__main__.Foo object at 0x0000000001D72AC8>
  Instance method is running
    self: <__main__.Foo object at 0x0000000001D72AC8>
  Class method is running
    cls: <class '__main__.Foo'>
    Class Type: <type 'type'>
  Static method is running
如果看他们的类型会发现:
classmethod是 <bound method type.test2 of <class '__main__.Foo'>>
staticmethod是 <function test3 at 0x000000000252EAC8>
instancemethod是 <unbound method Foo.test>

可见staticmethod和普通的函数一样的

类方法的第一个参数cls,
而实例方法的第一个参数是self,表示该类的一个实例。

并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。
下面的例子演示了派生类调用的时候传入的class是派生类的而不是基类的

1#-*- coding:utf-8 -*-
2
3class Base(object):
4    def test(self):   # instance method,必须有self来表示该实例
5        print "  Instance method is running"
6        print "    self:", self
7    @classmethod
8    def test2(cls):  # class method,注意需要cls这个参数,表示Foo这个类
9        print "  Class method is running"
10        print "    cls:", cls
11    @staticmethod
12    def test3():      # static method
13        print "  Static method is running"
14
15class Derived(Base):
16    pass
17
18if __name__ == "__main__":
19    # create an instance
20    o1 = Base()
21    o2 = Derived()
22
23    # use class method
24    o1.test2()
25    o2.test2()
26    
27    # use instance method
28    o1.test()
29    o2.test()
30
#-*- coding:utf-8 -*-



class Base(object):

    def test(self):   # instance method,必须有self来表示该实例

        print "  Instance method is running"

        print "    self:", self

    @classmethod

    def test2(cls):  # class method,注意需要cls这个参数,表示Foo这个类

        print "  Class method is running"

        print "    cls:", cls

    @staticmethod

    def test3():      # static method

        print "  Static method is running"



class Derived(Base):

    pass



if __name__ == "__main__":

    # create an instance

    o1 = Base()

    o2 = Derived()



    # use class method

    o1.test2()

    o2.test2()

    

    # use instance method

    o1.test()

    o2.test()


D:\httpHome\docs\python\code\class>python classMethodTypesDemo2.py
  Class method is running
    cls: <class '__main__.Base'>
  Class method is running
    cls: <class '__main__.Derived'>
  Instance method is running
    self: <__main__.Base object at 0x0000000001EB2AC8>
  Instance method is running
    self: <__main__.Derived object at 0x0000000001EB2E48>


如果有任何问题请发邮件到 isteps@126.com


广告内容, 如果不忙, 跪求点击