基础(八)

  • 面向对象
    • 特征
    • 封装示例
      • 1.析构函数
      • 2.过滤装饰器
    • 继承示例
      • 1. Employee和Programer类 单继承
      • 2. Employee、Programer、HR类 多继承易混乱
    • 多态示例

面向对象

特征

封装、继承、多态

封装示例

1.析构函数

c++有相似概念,repr函数输出对象时不输出全部信息

class Book:count = 0#def __init__(self,title,price = 0.0,author=None,count = 0):##构造函数def __init__(self, title, price=0.0, author=None):self.title = titleself.price = priceself.author = authorBook.count += 1##析构函数,删除对象使用def __del__(self):Book.count -= 1##控制台上直接使用对象执行def __repr__(self):return '<BOOK{} at 0x{} >'.format(self.title,id(self))##打印时执行def __str__(self):return '[BOOK{},PRICE{}]'.format(self.title,self.price)def print_info(self):print(self.title,self.price,self.author)def cls_method(cls):print('类函数')def static_method():print('静态函数,逻辑上与实例无关')if __name__ == '__main__':book = Book('python base',price = 20,author = 'Tom')#Book.count += 1book2 = Book('Flask')# Book.count += 1book3 = Book('ASP.net')#Book.count += 1del(book3)print(Book.count)Book.cls_method(book)Book.static_method()

输出
2
类函数
静态函数,逻辑上与实例无关

2.过滤装饰器

property,setter,deleter

import datetimeclass Student:def __init__(self,name,birthdate):self.name = nameself.birthdate = birthdate@property##属性,好处进一步过滤def age(self):return datetime.date.today().year - self.birthdate.year@age.setter##装饰器def age(self,value):raise AttributeError('禁止赋值年龄!')@age.deleterdef age(self):raise ArithmeticError('年龄不能删除')# def get_age(self):#     return datetime.date.today().year - self.birthdate.yearif __name__ == '__main__':s = Student('Tom',datetime.date(1992,3,1))print(s.birthdate)print(s.age)s.birthdate = datetime.date(1996,8,26)print(s.birthdate)print(s.age)

输出
1992-03-01
27
1996-08-26
23

  • 更改年龄报错
import datetimeclass Student:def __init__(self,name,birthdate):self.name = nameself.birthdate = birthdate@property##属性,好处进一步过滤def age(self):return datetime.date.today().year - self.birthdate.year@age.setter##装饰器def age(self,value):raise AttributeError('禁止赋值年龄!')@age.deleterdef age(self):raise ArithmeticError('年龄不能删除')if __name__ == '__main__':s = Student('Tom',datetime.date(1992,3,1))print(s.birthdate)print(s.age)s.birthdate = datetime.date(1996,8,26)s.age = 20print(s.birthdate)print(s.age)

输出
Traceback (most recent call last):
1992-03-01
File “F:/teacher/pythonbasetry/day7/Test.py”, line 33, in
s.age = 20
27
File “F:/teacher/pythonbasetry/day7/Test.py”, line 17, in age
raise AttributeError(‘禁止赋值年龄!’)
AttributeError: 禁止赋值年龄!

继承示例

1. Employee和Programer类 单继承

import datetimeclass Employee:def __init__(self,name,birthdate,department,salary):self.name = nameself.birthdate = birthdateself.department = departmentself.salary = salarydef give_raise(self,percent,bonus=.0):self.salary = self.salary * (1 + percent + bonus)@propertydef age(self):return datetime.date.today().year - self.birthdate.yeardef __repr__(self):return '<员工 :{}>'.format(self.name)def working(self):print ('员工 : {} 工作ing'.format(self.name))class Programer(Employee):def __init__(self,name,birthdate,department,salary,specialty,project):##基类super().__init__(name,birthdate,department,salary)self.specialty = specialtyself.project = projectdef working(self):print('程序猿:{} 在开发:{}'.format(self.name,self.project))if __name__ == '__main__':p = Programer('kitty',datetime.date(1996,8,26),'tech',8000,'python','cv')print(p)print(p.department)print(p.birthdate)print(p.salary)p.give_raise(.2,.1)print(p.salary)p.working()print(p.age)

输出
<员工 :kitty>
tech
1996-08-26
8000
10400.0
程序猿:kitty 在开发:cv
23
注:注意super中参数顺序
报错
return datetime.date.today().year - self.birthdate.year AttributeError: ‘str’ object has no attribute ‘year’
是因为参数顺序错误

2. Employee、Programer、HR类 多继承易混乱

import datetimeclass Employee:def __init__(self,name,birthdate,department,salary):self.name = nameself.birthdate = birthdateself.department = departmentself.salary = salarydef give_raise(self,percent,bonus=.0):self.salary = self.salary * (1 + percent + bonus)@propertydef age(self):return datetime.date.today().year - self.birthdate.yeardef __repr__(self):return '<员工 :{}>'.format(self.name)def working(self):print ('员工 : {} 工作ing'.format(self.name))class Programer(Employee):def __init__(self,name,birthdate,department,salary,specialty,project):##基类super().__init__(name,birthdate,department,salary)self.specialty = specialtyself.project = projectdef working(self):print('程序猿:{} 在开发:{}'.format(self.name,self.project))class HR(Employee):def __init__(self,name,birthdate,department,salary,level = 1):##多继承不建议supersuper().__init__()Employee.__init__(self,name,birthdate,department,salary)self.level = leveldef working(self):print('人事:{}面试ing'.format(self.name))if __name__ == '__main__':p = Programer('kitty',datetime.date(1996,8,26),'tech',8000,'python','cv')print(p)print(p.department)print(p.birthdate)print(p.salary)p.give_raise(.2,.1)print(p.salary)p.working()print(p.age)hr = HR('haha',datetime.date(1992,8,22),'人事',9000,2)hr.working()

多态示例

同一类型的不同实例对同一消息做出不同响应

  • 包含关联
import datetimeclass Department:def __init__(self,department,phone,manager):self.department = departmentself.phone = phoneself.manager = managerdef __repr__(self):return '部门:{}'.format(self.department)class Employee:def __init__(self,name,birthdate,department:Department,salary):self.name = nameself.birthdate = birthdateself.department = departmentself.salary = salarydef give_raise(self,percent,bonus=.0):self.salary = self.salary * (1 + percent + bonus)@propertydef age(self):return datetime.date.today().year - self.birthdate.yeardef __repr__(self):return '<员工 :{}>'.format(self.name)def working(self):print ('员工 : {} 工作ing'.format(self.name))class Programer(Employee):def __init__(self,name,birthdate,department,salary,specialty,project):##基类super().__init__(name,birthdate,department,salary)self.specialty = specialtyself.project = projectdef working(self):print('程序猿:{} 在开发:{}'.format(self.name,self.project))class HR(Employee):def __init__(self,name,birthdate,department,salary,level = 1):##多继承不建议supersuper().__init__()Employee.__init__(self,name,birthdate,department,salary)self.level = leveldef working(self):print('人事:{}面试ing'.format(self.name))if __name__ == '__main__':dep = Department('tech','010','Lily')#department use depp = Programer('kitty',datetime.date(1996,8,26),dep,8000,'python','cv')p.give_raise(.2,.1)print(p.salary)print(p.department)print(p.department.phone)

python基础(八):封装、继承、多态相关推荐

  1. 大数据笔记8—java基础篇4(面向对象-封装-继承-多态)

    面向对象 一.面向对象 1.面向过程 1.2.举例 1.3.总结 二.面向对象 1.简述 2.举例 3.思想特点 2.1.类的定义格式 2.1.1.简述 2.2.2.格式 2.3.3.示例 三.类的使 ...

  2. python 参数类型的多态_【Python】面向对象:类与对象\封装\继承\多态

    六.Python面向对象--类与对象\封装\继承\多态 1.什么是面向对象编程 1.1 程序设计的范式:程序可控,易于理解 1.2 抽象并建立对象模型 1.3 程序是不同对象相互调用的逻辑.每个对象在 ...

  3. python多态的三种表现形式_python小结----面向对象的三大特征(封装,继承,多态)

    面向对象的三大特征: 封装,继承,多态 面向对象的编程思想核心:高类聚,低耦合–程序的设计模式范畴 封装 什么是封装: 在面向对象编程的思想中,对代码进行高度封装,封装又叫包装 封装就是指将数据或者函 ...

  4. c语言编程 菲薄拉,C语言设计模式-封装-继承-多态

    快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...

  5. 面向对象 编程及面向对象三大属性:封装 继承 多态

    面向对象 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构.应用平台.分布式系统.网络管理结构. ...

  6. 第九课(面向对象):封装 继承 多态

    一.面向对象概念:根据模板(创建一个类)并实例化 这个思路就叫面向对象 二.使用面向对象编程好处: 可以重复使用(实例化类) 容易修改(只用修改类的模板) 三.面向对象的特点: 封装 继承 多态 类名 ...

  7. Java继承_Hachi君浅聊Java三大特性之 封装 继承 多态

    Hello,大家好~我是你们的Hachi君,一个来自某学院的资深java小白.最近利用暑假的时间,修得满腔java语言学习心得.今天小宇宙终于要爆发了,决定在知乎上来一场根本停不下来的Hachi君个人 ...

  8. 小白理解——封装继承多态

                                      一.封装 是什么:首先是抽象,把事物抽象成一个类,其次才是封装.对外表示为一个对象,隐藏对象的属性和动作实现的细节,仅对外公开接口. ...

  9. Day55-每日一道Java面试题-Java 面向对象编程三大特性: 封装 继承 多态

    Java 面向对象编程三大特性: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问.但是如果一个类没有 ...

  10. 白话文带你了解 封装 继承 多态

    这里讲的仅仅是带你理解 封装 继承 多态 染好您可以移步去别的文章学习具体的实现 (只是个人理解 您可以不爱,请别伤害哦!) 首先你要知道 java是面向对象的,说白了就是我拿你当个人,请认清你的地位 ...

最新文章

  1. 2021年大数据Spark(四十一):SparkStreaming实战案例六 自定义输出 foreachRDD
  2. ACL 2019 | 理解 BERT 每一层都学到了什么
  3. java list写入txt_Java - 如何将我的ArrayList写入文件,并将该文件读取(加载)到原始ArrayList?...
  4. 彻底卸载vscode Linux,ubuntu如何卸载vscode
  5. 控制台和Win32 API程序输出变量地址值
  6. Smartform中负号提前解决方法
  7. 桂林电子科技大学计算机导论,Welcome to Guilin University of Electronic Technology(桂林电子科技大学)...
  8. PHP图片上传,框架通用
  9. 相对路径和绝对路径概念
  10. 不同笔记本电脑BIOS的进入方法:
  11. 公募权益类基金投资者盈利洞察报告
  12. C/C++[codeup 1927]字符串内排序
  13. 这个“忽悠”马云10亿的男人,还了阿里5000亿,今天当选为院士!
  14. java ftps 证书_java – 连接到FTPS服务器
  15. linux查看键盘命令,usb键盘鼠标 linux驱动查看及安装
  16. Postgresql去掉某个字段多余的空格
  17. 【gradle exclude冲突依赖】
  18. 电脑便签损坏怎么修复
  19. 摄影知识系列讲座 - 第一章《光圈、快门篇》
  20. 程序员就是这样聊天把女朋友聊没的。。。

热门文章

  1. 桌面图标有蓝底怎么去掉?
  2. python登录注册程序编写_python写注册程序
  3. UI基础二:下拉,F4,OP等
  4. Apollo客户端使用指南
  5. c++打印心形_c语言如何打印心
  6. 淘宝API签名异常,如何正确计算SIGN参数?(error code:25 Invalid Signature)
  7. 苹果CEO乔布斯鲜为人知的15个小秘密
  8. 锁屏后重新登录程序无响应问题分析
  9. 转载]施一公:如何提高英文的科研写作能力
  10. 森林防火系统集成解决方案