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
绑定和方法调用
- 方法是类内部定义的函数(即方法是类属性而不是实例属性)
- 方法只有在所属的类有实例时才能被调用,存在一个实例时,方法才被认为绑定到该实例,没有实例的方法是未绑定的
- 任何一个方法的第一个参数都是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))

浙公网安备 33010602011771号