• 十七、Python面向对象之继承


    在面向对象,继承是一个很重要的特性
    子类与父类,子类是对父类的一种扩展,在父类的属性和方法上进行一些扩展
    示例:没带继承
     
    #定义一个带编号和状态的门的类
    class Door(object):
    def __init__(self,num,status):
    self.num = num
    self.status = status
    def open(self):
    self.status = 'open'
    def close(self):
    self.status = 'close'
     
    #定义一个可以锁的门的类
    class Lockable(object):
    def __init__(self,num,status,locked):
    self.num = num
    self.status = status
    self.locked = locked
    def open(self):
    if not self.locked: #如果没有锁的话,那么我就打开它
    self.status = 'open'
    else:
    print "the door is locked"
    def close(self):
    self.status = 'close'
    ======================================================================
    ======================================================================
    ======================================================================
    上例中我们发现Lockable这个类就是在Door类的基础上增加了一个locked实例变量
    和有没有锁的方法,其他地方都是一样的。
    #继承
    class Door(object):
    def __init__(self,num,status):
    self.num = num
    self.status = status
    def open(self):
    self.status = 'open'
    def close(self):
    self.status = 'close'
     
    #继承自父类Door
    class Lockable(Door):
    def __init__(self,num,status,locked):
    super(Lockable,self).__init__(num,status) #这里super说明了你构造函数继承了你的父类的num和status两个实例变量,里面的写法是固定的(子类名,self)
    self.locked = locked #这里因为你继承了父类,所以我们这里就不用再self.num和self.status给它们赋值,locked是新增的,需要对其赋值
    #对open方法进行重载
    def open(self):
    if not self.locked: #如果没有锁的话,那么我就打开它
    #调用父类的方法
    super(Lockable,self).open()
    else:
    print "the door is locked"
     
     
    class Unlockable(Door): #这里我定义了一个没有锁的门,并且我什么都不做,它继承了父类Door,即使他什么都不做,Door的方法它也都继承下来了
    pass
     
     
    u = Unlockable(1,'open')
    print (u.status)
     
    l = Lockable(1,'open',True)
    l.open()
    print (l.status)
     
    l = Lockable(1,'open',False)
    l.open()
    print (l.status)
     
     
     
    ===========================================================================
    ===========================================================================
    ===========================================================================
    静态方法:
     
    @static_method #静态方法,类的工具包
    def info() #不用加self,无需实例化,不能访问实例其他信息
     
     
    @class_method #类方法,
    def info(self): #能访问类变量,不能访问实例变量,不需要实例化,即可调用
     
     
    @property #将函数变成静态属性,需实例化方可调用,如果不实例化则仅仅是打印内存地址,调用的时候不需要加()
    def sayhi(self): #
    print "-----say hi",self.name
    return "test"
     
     
    m = MyClass()
    print (m.sayhi) #会打印出-----say hi
     
    如果是这样:
    print (MyClass.sayhi) #则仅仅只会打印出<property object at 0x0200F8A0>
     
    如果是这样:
    print (MyClass.sayhi()) #则会报错
     
     
     
    =========================================================================
    =========================================================================
    =========================================================================
    什么情况需要实例化才能调用,什么情况不需要实例化也能调用:
    总结:
    你只要看到有self的就代表需要实例化才能调用(仅仅在没有那三个特殊方法的情况下)
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    【XAF】非持久化对象分组和属于不同会话
    【原创】XAF 非持久对象界面中更新xpo的状态查询
    Java字符串操作方法集
    Java易忘知识点统计
    Android常用依赖库搜集
    Android Studio报错Unable to resolve dependency for ':app@release/compileClasspath':无法引用任何外部依赖的解决办法
    Codewars练习Python
    Python学习日记之正则表达式re模块
    Linux学习日记之crontab使用notify-send实现每小时通知提醒
    Linux学习日记之Deepin下查看crontab运行日志
  • 原文地址:https://www.cnblogs.com/steven9898/p/11329433.html
Copyright © 2020-2023  润新知