十七、Python面向对象之继承
2024-09-06 21:00:05
在面向对象,继承是一个很重要的特性
子类与父类,子类是对父类的一种扩展,在父类的属性和方法上进行一些扩展
示例:没带继承
#定义一个带编号和状态的门的类
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的就代表需要实例化才能调用(仅仅在没有那三个特殊方法的情况下)
最新文章
- salesforce 零基础学习(四十四)实现checkbox列表简单过滤功能
- [ACM_几何] F. 3D Triangles (三维三角行相交)
- Extjs读取本地下拉选框数据源,分为text和value,显示text,传值value
- 算法库:OpenCV3编译配置
- c语言—临界资源管理
- Android与JS混编(js调用android相机)
- shu_1241 邮局位置问题
- jQuery UI 是建立在 jQuery JavaScript 库上的一组用户界面交互、特效、小部件及主题
- TFS二次开发的数据统计以PBI、Bug、Sprint等为例(一)
- 学习笔记——Java数字处理类
- [原创]CentOS7安装远程工具teamviewer12
- Python档案袋( Socket 与 ScoketServer 通信 )
- JMeter接口测试 (二) ~ 参数化
- Pandas系列(十六)- 你需要学会的骚操作
- 小程序 map组件问题 cover-view问题
- MySQL 8 新特性之自增主键的持久化
- ORA-12541:TNS:无监听程序 解决办法
- spring AOP源码分析(一)
- [整理]CSS3 滤镜
- 使用线性回归识别手写阿拉伯数字mnist数据集
热门文章
- Kettle Unable to get list of element types for namespace &#39;pentaho&#39;
- ASP.NET Core 新建项目(Windows)
- inputType导致TextView不能多行显示
- requests访问https站点证书告警问题
- Golang(八)go modules 学习
- [Powershell]使用Msbuild构建基于.NET Framework的WebAPI项目
- Hystrix(服务熔断,服务降级)
- Kelp.Net是一个用c#编写的深度学习库
- PHP 函数禁用设置方法
- python3 四舍五入(0.5可以进1)