|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 尘鸯 于 2017-9-22 09:23 编辑
类和对象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 |
|