|  | 
 
| 
本帖最后由 尘鸯 于 2017-9-22 09:23 编辑
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  
 类和对象2
 
 继承:一个新类(子类)获得被继承的类(父类)的属性和方法
 继承方法:class   new class(parent):
 例:import random as r
 #Fish是被继承类,即父类
 class Fish:
 def __init__(self):
 self.x = r.randint(0,10)
 self.y = r.randint(0,10)
 def move(self):
 self.x -= 1
 print("我的位置是:", self.x, self.y)
 #Carp是新类,即子类
 class Carp(Fish):
 pass
 实例化:carp = Carp()
 carp.__init__()
 carp.move()
 返回:我的位置是:8  2
 
 当子类中的方法名和父类相同时,子类的方法会覆盖父类的方法。在子类调用时,调用的是子类的方法
 例:import random as r
 
 class Fish:
 def __init__(self):
 self.x = r.randint(0,10)
 self.y = r.randint(0,10)
 def move(self):
 self.x -= 1
 print("我的位置是:", self.x, self.y)
 
 class Shark(Fish):
 def __init__(self):
 self.hungry = True
 def eat(self):
 if self.hungry:
 print("大吃特吃!")
 self.hungry = False
 else:
 print("吃不下了!")
 实例化:shark = Shark()
 shark.__init__()
 shark.move()
 返回:报错:子类Shark中没有'x'这个属性
 当shark调用__init__()时,由于方法名和父类相同,所以调用的是自己的__init__()方法。再调用move()时,需要调用'x,y'属性,但shark中没有,所以报错了。
 推荐的解决方法:使用super方法来调用父类中的__init__()方法
 def __init__(self):
 super.__init__()
 self.hungry = True
 
 多重继承:同时继承多个父类的属性和方法
 例:class Test1:
 def  t1(self):
 print('我是test1')
 class Test2:
 def t2(self):
 print('我是test2')
 class  A(Test1,Test2):
 pass
 实例化:a = A()
 a.t1()
 返回:我是test1
 a.t2()
 返回:我是test2
 
 
 组合
 把类的实例化放到新类中,新类就会将旧类给组合在一起。横向类的关系
 例:class  Panda:
 def __init__(self, x):
 self.num = x
 
 class Tiger:
 def __init__(self, x):
 self.num = x
 
 class Zoom:
 def __init__(self, x, y):
 self.panda = Panda(x)
 self.tiger = Tiger(y)
 def print_num(self):
 print('动物园里有熊猫 %d 只,老虎 %d 只' % (self.panda.num, self.tiger.num))
 如同Zoom类一样,Zoom类将panda和tiger类的实例化都放到自己的__init__方法中,即Zoom将panda类和tiger类组合在一起
 
 
 一些相关的BIF(内置方法)
 issubclass(class,classinfo):class是不是classinfo的子类,其中classinfo可以是类对象组成的元组,只要class与其中的一个匹配上即返回True
 例:class A():
 pass
 
 class B(A):
 pass
 issubclass(B, A)
 返回:True
 
 isinstance(object, classinfo):object是不是classinfo的实例化对象,如果传入的object不是一个类对象则报错
 
 hasattr(object, name):判断在类对象object中有没有指定的对象name,其中name需要用单引号括起来,形成字符串
 例:class A:
 def __init__(self, x):
 self.x = x
 实例化:a = A()
 hasattr(a, 'x')              返回:True
 getattr(object, name[, default]):获得类对象object中的name属性的值。当name不存在时,如果填写了default的值,则返回default的值,未填写则报错
 例:class A:
 def __init__(self, x=10):
 self.x = x
 实例化:a = A()
 getattr(a, 'x')               返回:10
 getattr(a, 'y', '没有找到该属性...')                 返回:没有找到该属性...
 serattr(object, name, value):设置object中属性name的值value,如果该属性不存在,则创新新属性name,并赋值
 例:class A:
 def __init__(self, x=10):
 self.x = x
 实例化:a = A()
 setattr(a, 'y', 12)
 getattr(a, 'y', '没有找到该属性...')                 返回:12
 delattr(object, name):删除object中属性name,如果name不存在,则抛出异常
 例:class A:
 def __init__(self, x=10, y=12):
 self.x = x
 self.y = y
 实例化:a = A()
 delattr(a, 'y')
 property():在类中,将多个方法结合起来赋予给某个属性,实例化对象后直接调用该属性即可。property中只作用于一个get,set方法,存放多个只会作用于第一个
 例:class A:
 def __init__(self, s=10):
 self.s = s
 def setS(self,s):
 self.s = s
 def getS(self):
 print(self.s)
 def delS(self):
 del self.s
 x = property(getS, setS, delS)
 实例化:a = A()
 a.getS()
 返回:10
 a.x = 5
 a.getS()
 返回:5
 | 
 |