关于类的小总结:
一、什么是类?
class 名称(父类名字,没有父类就写object):
pass
二、什么是方法?
类里面定义的函数就是方法,如:
class 名称(父类名字,没有父类就写object):
def sayHello(self): # 这个类里面的函数,就是方法。
print 'hello!'
三、什么是类实例?
如以下一个类:
class Goodmorning(object):
pass
创建一个类实例很简单,gm = Goodmorning()
四、什么是子类?
简单的说就是定义个类,括号里写上父类的名字,就是子类,子类继承父类的方法。如
class Good(Goodmorning):
pass
五、如何调用实例方法?
如下面一个类:
class Sh(object):
def sayHello(self):
print 'hello!'
首先实例化这个类,
sh = Sh()
然后用句点调用方法,
sh.sayHello()
六、继承及覆盖父类的方法
首先创建一个父类A:
>>> class A(object):
def sayhello(self):
print 'hello!'
实例化这个父类:
>>> a = A()
调用方法:
>>> a.sayhello()
hello!
创建一个子类B看继承父类方法:
>>> class B(A):
def s(self):
pass
实例化这个子类:
>>> b = B()
调用方法:(继承了父类的方法)
>>> b.sayhello()
hello!
再创建一个子类C看覆盖父类方法:
class C(A):
def sayhello(self):
print 'CCCCCCsay hello!'
实例化这个子类:
>>> c = C()
调用方法:(覆盖了父类的方法)
>>> c.sayhello()
CCCCCCsay hello!
虽然子类C继承了父类A的方法sayhello(),但是子类C定义了自己的方法sayhello(),因此覆盖了父类的方法。当然,如果我们需要用到父类的sayhello()方法时,可以用父类的实例来调用,如:
>>> a.sayhello()
hello!
七、关于__init__()方法
__init__()方法是在类被实例化时首先被自动调用的方法,如
>>> class SA(object):
def __init__(self):
print 'first!!'
>>> sa =SA()
first!!
__init__()方法的覆盖,如:
>>> class P(object):
def __init__(self):
print "calling P's constructor"
>>> class C(P):
def __init__(self):
print "calling C's constructor"
>>> c = C()
calling C's constructor
如想同时获得子类C和父类P的__init__方法:
>>> class C(P):
def __init__(self):
P.__init__(self)
print "calling C's constructor"
>>> c = C()
calling P's constructor
calling C's constructor
或使用super()
>>> class C(P):
def __init__(self):
super(C, self).__init__()
print "calling C's constructor"
>>> c = C()
calling P's constructor
calling C's constructor
可以考虑使用super(C, self).__init__()代替P.__init__(self),因为这样可以不必写父类名字(P),这样的话当改变了继承关系的时候,不用到处去找哪个地方写了P.__init__(self)……当然,super()的主要用途就是查找父类属性。
八、当存在多个父类、子类、子孙类时,方法解释顺序
比如有两个父类P1、P2,两个子类C1、C2、一个子孙类F,当F的实例调用F中不存在的方法时,查找顺序为由下至上,由左至右的顺序,及F-->C1-->C2-->P1-->P2,若中间就找到,如C2查找到要调用的方法,即停止(这里说的是新式类。)
九、类、实例和其他对象的几个内建函数
0x01.issubclass(a, b)用来判断a是否是b的子类(或子孙类等),返回True或False,如:
>>> class P(object):
pass
>>> class C(P):
pass
>>> class D(C):
pass
>>> issubclass(C, P)
True
>>> issubclass(D, P)
True
>>> issubclass(D, C)
True
如果a就是b的话,也会返回True:
>>> issubclass(P, P)
True
0x02.isinstance(a, b)用来判断a是否是b的实例,同样返回True或False,如
>>> class A(object):
pass
>>> class B(object):
pass
>>> a = A()
>>> b = B()
>>>
>>> isinstance(a, A)
True
>>> isinstance(b, A)
False
>>> isinstance(b, B)
True
可以想象,isinstance(a, b)同样可以判断一个对象a是否是b类型,如:
>>> isinstance(7, int)
True
0x03.hasattr(), getattr(),setattr(), delattr()
(1)hasattr()用来判断某类中是否有某个属性
(2)getattr()用来获取某类中的某个属性
(3)setattr()用来向某个类中添加一个属性或覆盖某个属性
(4)delattr()用来从某个类中删除一个属性
>>> class sayH(object):
def __init__(self):
self.say = 'hello!'
>>> sh = sayH()
>>> hasattr(sh, 'say')
True
>>> getattr(sh, 'say')
'hello!'
>>> setattr(sh, 'bye', 'byebye!')
>>> getattr(sh, 'bye')
'byebye!'
>>> delattr(sh, 'say')
>>> getattr(sh, 'say')
Traceback (most recent call last):
File "<pyshell#371>", line 1, in <module>
getattr(sh, 'say')
AttributeError: 'sayH' object has no attribute 'say'
0x04.dir(a)返回a的属性的列表
0x05.vars(a)返回a的属性及值的字典
============================
未完……