python - 面向对象

抽象/实现:指对现实世界问题和实体的本质表现、行为和特征建模,建立一个相关的子集

封装/接口:描述了对数据/信息进行隐藏的观念,对数据属性提供接口和访问函数。

合成     :将组件拼接形成更为复杂的组件。联合关系:对子组件的访问是允许的;聚合关系:封装的组件仅能通过定义好的接口来访问

派生/继承:派生描述子类的创建,保留已存类型中数据和行为,允许修改或定义其它操作,不会修改原类的定义;继承描述子类属性从祖先类继承的这种方式

泛化/特化:表示所有子类与其父类及祖先有一样的特点(is-a模型)

多态     :指明对象如何通过共同的属性和动作操作及访问,而不需考虑它们具体的类

自省/反射:该性质展示了某对象如何在运行期间取得自生信息。如dir()和type()内建函数,__dict__、__name__和__doc__特殊属性


类的特殊属性

 

C.__name__ 类C的名字(string)

C.__doc__ 类C的文档字符串

C.__bases__ 类C的父类构成的元组

C.__dict__ 类C的属性

C.__module__ 类C定义所在的模块

C.__class__ 实例C所对应的类

实例

 

实例化

>>> class MyClass(object): # 定义类

... pass

>>> mc = MyClass() # 实例化

构造器方法__init__(),__new__()

实例化时,若未实现__init__()方法,返回对象,实例化完毕;若__init__()已经实现,它被调用

Python可以对内建类型进行派生,__new__()在这种情况下被使用,用来实例化不可变对象如派生字符串、数字等

__new__()和__init__()在类创建时,传入了相同的参数

解构器方法__del__()

Python有垃圾回收机制,通常不被实现

类属性和实例属性

>>> class Test(object):

... count = 0 # 类属性

... def __init__(self):

... self.count = 9 # 实例属性

... def printA(self):

... print Test.count # 打印类属性

... def printB(self):

... print self.count # 打印实例属性

>>> t = Test()

>>> t.printA()

0

>>> t.printB()

10

>>> Test.count

0

>>> t.count

10

  ** 另外如果类中没有同名的实例属性

>>> class A(object):

... count = 10

>>> a = A()

>>> a.count

10

>>> A.count

10

>>> a.count = 99 # 对实例属性赋值,若该实例属性不存在将创建

>>> a.count

99

>>> A.count # 并未影响类属性

10 

  可以通过类属性实现对一个类有多少个实例被创建进行跟踪:

class Test(object):

count = 0

def __init__(self):

Test.count += 1

def __del__(self):

Test.count -= 1

def HowMany(self):

return Test.count

绑定和方法调用

 

  1. 方法是类内部定义的函数(即方法是类属性而不是实例属性)
  2. 方法只有在所属的类有实例时才能被调用,存在一个实例时,方法才被认为绑定到该实例,没有实例的方法是未绑定的
  3. 任何一个方法的第一个参数都是self,表示在类实例的方法中引用方法所绑定的实例,调用方法时该参数无需明确传入

创建静态方法和类

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)

使用修饰符创建

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__

通过继承覆盖(Overriding)

class P(object):

def foo(self):

print "Hi, I am P.foo()"

class C(P):

def foo(self):

print "Hi, I am C.foo()" 

>>> c = C()

>>> c.foo()

Hi, I am C.foo()

>>> P.foo(c) # 调用基类中被覆盖的方法,并未实例化P,显式的传入了P的子类的实例c(显式的传递了self)

Hi, I am P.foo()

>>> super(C,c) # 使用super()得到基类方法

Hi, I am P.foo()

重写__init__不会自动调用基类的__init__,如果子类中不覆盖__init__,父类__init__将被继承

从标准类中派生

class RoundFloat(float):

def __new__(cls, val):

return super(RoundFloat, cls).__new__(cls, round(val, 2)) 

posted @ 2014-07-09 01:30  LOTUS2014  阅读(244)  评论(0)    收藏  举报