十七、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的就代表需要实例化才能调用(仅仅在没有那三个特殊方法的情况下)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2019-08-09 20:24  Paco_Pig  阅读(169)  评论(0编辑  收藏  举报