鱼C论坛

 找回密码
 立即注册
查看: 1981|回复: 0

[技术交流] 《零基础入门学习Python》第二十一讲笔记--类和对象2

[复制链接]
发表于 2017-9-21 15:03:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-23 17:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表