#encoding=utf-8
#绑定,存在一个实例时,方法认为绑定到实例
#调用非绑定方法,调用子类覆盖掉的父类的构造方法
#def __init__(self,nm,em):
# Baseclass.__init__(self,nm)
#静态方法和类方法
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)
tsm = TestStaticMethod()
TestStaticMethod.foo()
tsm.foo()
tcm = TestClassMethod()
tcm.foo()
TestClassMethod.foo()
#类和实例均可以调用
#现在更常用函数修饰符
class TestStaticMethod:
#实例方法
#。实例方法隐含的参数为类实例self
def InstanceFun(self):
print 'InstanceFun'
#静态方法
#静态方法无隐含参数,主要为了类实例也可以直接调用静态方法
@staticmethod
def foo():
print 'calling static method foo()'
class TestClassMethod:
#类方法
#类方法隐含的参数为类本身cls
@classmethod
def foo(cls):
print 'calling class method foo()'
print 'foo() is part of class:', cls.__name__
#逻辑上类方法应当只被类调用,实例方法实例调用,静态方法两者都能调用
# Python实现了一定的灵活性使得类方法和静态方法,都能够被实例和类二者调用
#组合
#一个类由他本身和其他类组合而成,has-a的关系。
class Name(object):
def __init__(self,nm):
self.name = nm
class Phone(object):
def __init__(self,ph):
self.phone = ph
#New类拥有Name类实例和Phone类实例
class NewAddrBookEntry(object):
def __init__(self,nm,ph):
self.name = Name(nm) #创建name实例
self.phone = Phone(ph) #创建Phone实例
print 'create instance for:',self.name
book = NewAddrBookEntry('hh','57788')
'''=============子类和派生=============='''
class Parent(object):
def parentMethod(self):
print 'calling parent method'
class Child(Parent):
def childMethod(self):
print 'calling child method'
p = Parent()
p.parentMethod()
c = Child()
c.childMethod()
c.parentMethod()
#子类调用父类方法
'''===============继承==================='''
#继承,基类的属性遗传给派生类
class P:
'P class'
def __init__(self):
print 'create an instance of ', \
self.__class__.__name__
class C(P):
pass
#类P,有文档字符串(__doc__),构造器。
#类C,文档字符串是各自的,会继承P的构造器
p = P()
print p.__class__,P.__bases__,P.__doc__ #所属类名,父类,文档字符串
c = C()
print c.__class__,C.__bases__,C.__doc__
#__bases__包含父类的集合的元组,没有父类,显示空
class A(object):
pass
class B(A):
pass
class C(B):
pass
class D(A): #会报错,不知道什么原因
pass
print A.__bases__
print C.__bases__
print D.__bases__
#通过继承覆盖方法、
class P(object):
def foo(self):
print 'hi,i am P-foo()'
p = P()
p.foo()
class C(P):
#C继承自P,定义了自己的foo方法时候会覆盖
def foo(self):
print 'hi, i am c-foo()'
c = C()
c.foo()
#调用未绑定的基类方法,明确给出子类的实例
P.foo(c)
print '====='
class C(P):
def foo(self):
P.foo(self) #未绑定的方法显示地传递了self,调用p-foo
print 'hi i am c-foo()'
c = C()
c.foo()
print '===='
#更好使用super()方法
class C(P):
def foo(self):
super(C,self).foo() #调用p-foo,super不需要明确给出任何基类的名字
print 'hi , i am c-foo()'
c = C()
c.foo()
'''=======多重继承==========='''
#子类继承自多个父类,究竟调用哪个方法,深度优先搜索
class P1(object):
def foo(self):
print 'i am P1-foo()'
class P2(object):
def foo(self):
print 'i am P2-foo()'
def bar(self):
print 'i am P2-bar()'
class C1(P1,P2):
pass
class C2(P1,P2):
def bar(self):
print 'i am C2-bar()'
class CC(C1,C2):
pass
#P1:foo P2:foo,bar
#C1继承P1,P2 C2:bar 继承C1,C2
#CC继承C1,C2
cc = CC()
cc.foo() #CC==C1==C2==P1 CC找最亲的父类C1,在找父类C2。C1找父类,广度优先搜索
cc.bar() #CC==C1==C2 CC找最亲父类C1,再找父类C2
C2.bar(cc)
#查找顺序
print '======',CC.__mro__
'''=========类,实例,和其他对象的内建函数======='''
#issubclass(sub,sup)sub子类是不是sup父类的子类
#isinstance(obj1,class)obj1实例是不是类class的实例
#hasattr,getattr,setattr,delattr, 属性
#dir(),vars()