Python面向对象入门
class B:def f(self):self.g()def g(self):print("B.g Called.")class C(B):def g(self):print("C.g Called.")b = B()c = C()b.f()c.f()#调用f()的时候self是c的实例,所以调用c的g()'''B.g Called.C.g Called.'''
#导入可以获取日期的包import datetime#继承现有的错误类型,创建两个空的错误类class PersonTypeError(TypeError):passclass PersonValueError(ValueError):pass#构造基类Personclass Person:_num = 0@staticmethoddef _hello(str):return print("我是静态方法"+ str)def __init__(self,name ,sex, birthday, ident):if not(isinstance(name, str)) and sex in ("男","女"):#name 不是字符串或者性别不是这两个的时候报错raise PersonTypeError(name ,sex)try:birth = datetime.date(*birthday)except:raise PersonValueError("Wrong date:", birthday)self._name = name#表示约定的私有属性self._sex = sexself._birthday = birthdayself._id = identPerson._num += 1#每调用一次初始化,这个值都增加1,表示计数def id(self): #定义简单的方法取出内部的属性值,相当于简单的getter方法return self._iddef name(self):return self._namedef sex(self):return self._sexdef birthday(self):return self._birthdaydef age(self):return (datetime.date.today().year - self._birthday.year)def set_name(self,name): #定义简单的方法:设置属性值,相当于简单的setter方法if not isinstance(name, str):raise PersonValueError("set_name", name)self._name = namedef __lt__(self,another): #小于运算的方法要求另外的一个参数也是Person的实例if not isinstance(another, Person):raise PersonTypeError(another)return self._id < another._id@classmethoddef num(cls): #获取计数return Person._numdef __str__(self):return " ".join((self._id,self._name,self._sex,str(self._birthday)))def details(self):self._hello("self调用")return ", ".join(("编号: " + self._id,"姓名: " + self._name,"性别: " + self._sex,"出生日期: " + str(self._birthday)))#join参数要求可迭代的元组#手动实例化p1 = Person("jason","男",(1992,8,12),"201422501030")p2 = Person("peggy","女",(1994,10,14),"201422501032")p3 = Person("shown","男",(1993,8,13),"201422501031")p4 = Person("thea","女",(1995,11,15),"201422501033")plist2 = [p1,p2,p3,p4]for p in plist2:print(p)print("\nAfter Sorting:")plist2.sort(key=None, reverse=True)for p in plist2:print(p.details())print("People created:", Person.num(),"\n")Person._hello("Persop调用")p1._hello("实例调用")#继承创建第一个类:学生类class Student(Person):_id_num = 0@classmethoddef _id_gen(cls):cls._id_num+=1year = datetime.date.today().yearreturn "1{:04}{:05}".format(year, cls._id_num)#构造学生学号,1+年份+编号def __init__(self,name,sex,birthday,department):#重写初始化方法,Person.__init__(self, name, sex, birthday, Student._id_gen())#指明了父类,要self参数self._department = departmentself._enroll_date = datetime.date.today()self._courses = {} #空字典def set_course(self,course_name):self._courses[course_name] = None #给key赋值,value为空def set_score(self,course_name,score):if course_name not in self._courses:raise PersonValueError("No this course selected:", course_name)self._courses[course_name] =score #给value赋值def scores(self):return [(cname, self._courses[cname]) for cname in self._courses]def details(self):return ", ".join((Person.details(self),"入学日期: " + str(self._enroll_date),"院系: " + self._department,"课程记录: " + str(self.scores())))s1 = Student("Charles","男",(1992,8,12),"Automation Dept")s2 = Student("jason","男",(1991,9,18),"Cybernetics Dept")print(s1)s1.set_course("Python")#选课s1.set_score("Python", 90)#给分s1.set_course("Spark")s1.set_score("Spark",100)print(s1.scores())print(s1.details())print(s2.details())print("\n")#继承创建第二个类:员工类class Staff(Person):_id_num = 0@classmethoddef _id_gen(cls,birthday):cls._id_num +=1birth_year = datetime.date(*birthday).yearreturn "0{:04}{:05}".format(birth_year, cls._id_num)def __init__(self,name,sex,birthday,entry_date=None):super().__init__(name, sex, birthday, Staff._id_gen(birthday))if entry_date:try:self._entry_date = datetime.date(*entry_date)except:raise PersonValueError("Wrong date:", entry_date)else:self._entry_date = datetime.date.today()self._salary = 1720self._depertment = "未定"self._position = "未定"def set_salary(self,amount):if not type(amount) is int:raise TypeErrorself._salary = amountdef set_posotion(self,position):self._position = positiondef set_department(self,department):self._depertment = departmentdef details(self):return ", ".join((super().details(),"入职日期: " + str(self._entry_date),"院系: "+ self._depertment,"职位: " + self._position,"工资: " + str(self._salary)))t1 = Staff("natasha","女",(1991,9,18))t2 = Staff("heater","女",(1992,10,19))print(t1)print(t2)t1.set_department("数学")t1.set_posotion("讲师")t1.set_salary(8888)print(t1.details())print(t2.details())
201422501030 jason 男 (1992, 8, 12)201422501032 peggy 女 (1994, 10, 14)201422501031 shown 男 (1993, 8, 13)201422501033 thea 女 (1995, 11, 15)After Sorting:我是静态方法self调用编号: 201422501033, 姓名: thea, 性别: 女, 出生日期: (1995, 11, 15)我是静态方法self调用编号: 201422501032, 姓名: peggy, 性别: 女, 出生日期: (1994, 10, 14)我是静态方法self调用编号: 201422501031, 姓名: shown, 性别: 男, 出生日期: (1993, 8, 13)我是静态方法self调用编号: 201422501030, 姓名: jason, 性别: 男, 出生日期: (1992, 8, 12)People created: 4我是静态方法Persop调用我是静态方法实例调用1201600001 Charles 男 (1992, 8, 12)[('Python', 90), ('Spark', 100)]我是静态方法self调用编号: 1201600001, 姓名: Charles, 性别: 男, 出生日期: (1992, 8, 12), 入学日期: 2016-08-24, 院系: Automation Dept, 课程记录: [('Python', 90), ('Spark', 100)]我是静态方法self调用编号: 1201600002, 姓名: jason, 性别: 男, 出生日期: (1991, 9, 18), 入学日期: 2016-08-24, 院系: Cybernetics Dept, 课程记录: []0199100001 natasha 女 (1991, 9, 18)0199200002 heater 女 (1992, 10, 19)我是静态方法self调用编号: 0199100001, 姓名: natasha, 性别: 女, 出生日期: (1991, 9, 18), 入职日期: 2016-08-24, 院系: 数学, 职位: 讲师, 工资: 8888我是静态方法self调用编号: 0199200002, 姓名: heater, 性别: 女, 出生日期: (1992, 10, 19), 入职日期: 2016-08-24, 院系: 未定, 职位: 未定, 工资: 1720
Python面向对象入门的更多相关文章
- python面向对象入门(1):从代码复用开始
本文从代码复用的角度一步一步演示如何从python普通代码进化到面向对象,并通过代码去解释一些面向对象的理论.所以,本文前面的内容都是非面向对象的语法实现方式,只有在最结尾才给出了面向对象的简单语法介 ...
- Python基础入门教程
Python基础入门教程 Python基础教程 Python 简介 Python环境搭建 Python 基础语法 Python 变量类型 Python 运算符 Python 条件语句 Python 循 ...
- Python基础入门教程,Python学习路线图
给大家整理的这套python学习路线图,按照此教程一步步的学习来,肯定会对python有更深刻的认识.或许可以喜欢上python这个易学,精简,开源的语言.此套教程,不但有视频教程,还有源码分享,让大 ...
- Python怎么样入门?Python基础入门教程
给大家整理的这套python学习路线图,按照此教程一步步的学习来,肯定会对python有更深刻的认识.或许可以喜欢上python这个易学,精简,开源的语言.此套教程,不但有视频教程,还有源码分享,让大 ...
- Python快速入门
Python快速入门 一.基础概要 命名:h.py Linux命令行运行:python h.py 注释.数字.字符串: 基本类型只有数字与字符串 #python注释是这样写的 ''' 当然也可以这样 ...
- Python 简单入门指北(二)
Python 简单入门指北(二) 2 函数 2.1 函数是一等公民 一等公民指的是 Python 的函数能够动态创建,能赋值给别的变量,能作为参传给函数,也能作为函数的返回值.总而言之,函数和普通变量 ...
- python面向对象重新梳理
关于本篇博文: 面向对象中所有的内容的重新梳理,其实面向对象的知识早在一个多月前就学习过并整理过,但是发现还是有所欠缺,故在此以极其简介的语言风格重新梳理一遍 面向对象详细介绍:http://www. ...
- Java面向对象入门
Java面向对象入门 一.Java面向对象的基本组成 Java类及类的成员:属性.方法.构造器:代码块.内部类 面向对象三大特征:封装.继承.多态(抽象) 关键字:this.super.static. ...
- python从入门到大神---1、初始化实例、类属性、方法
python从入门到大神---1.初始化实例.类属性.方法 一.总结 一句话总结: 方法不加括号是代码段:感觉python方法和js,php很类似,不加括号是代码段,加括号变成方法,比如f,f() 1 ...
随机推荐
- Linux修改系统以及pip更新源
Linux修改系统以及pip更新源 时间:2015-08-01来源:csdn 作者:henulwj 修改系统更新源 你是否跟我一样在刚看时接触Linux时被系统更新源问题搞得晕头转向,不同的Linux ...
- Erlang-特性
一.模式匹配: 模式匹配作为Erlang的基础,用来完成很多不同的任务:可以用它从数据结构中提取字段值,在函数中进行流程控制,或者当你向一个进程发送消息时,从并行程序刷选那些需要处理的消息: 二.函数 ...
- Oracle通过sqlplus spool导入导出数据
第一部分(实例,主要分两步),第二部分(参数小总结),第三部分(完全参数总结) 第一部分 第一步 :这是我的导出数据的脚本call.sqlconn scott/tigerset echo offset ...
- href="#"会导致location.replace(location.href);脚本不工作
我们经常这样:<a onclick="xxx" href="#" 其实这不是一个好习惯,当点下这个连接后,主页面的URL后面会加个#号,这样就会导致很多J ...
- Quartz2D简介及基本线条绘制
* Quartz2D简介 1.什么是Quartz2D? 他是一个二维的绘图引擎,同时支持iOS和Mac系统 2.Quartz2D能完成的工作 画基本线条,绘制文字,图片,截图,自定义UIView. 3 ...
- Jquery知识
1.窗口自适应调整 (设置layout的fit属性值为true即可) //窗口自适应调整 $(function() { windowResize(); //文档载入时加载 $(window).resi ...
- php socket通信(tcp/udp)
注意 1.在socket_bind的时候ip地址不能真回环地址如127.0.0.1 2.server.php后台跑起来的时候 nohup php server.php > /var/tmp/a. ...
- day3 python 函数
常犯的错误: IndentationError:expected an indented block说明此处需要缩进,你只要在出现错误的那一行,按空格或Tab(但不能混用)键缩进就行... 函数是指一 ...
- 杭电1013-Digitai Root(另解)
#include<stdio.h>#define maxsize 1000 int main(){ char N[maxsize+1]; int i,j,sum,n; c ...
- stl map底层之红黑树插入步骤详解与代码实现
转载注明出处:http://blog.csdn.net/mxway/article/details/29216199 本篇文章并没有详细的讲解红黑树各方面的知识,只是以图形的方式对红黑树插入节点需要进 ...