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):
pass
class PersonValueError(ValueError):
pass
#构造基类Person
class Person:
_num = 0
@staticmethod
def _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 = sex
self._birthday = birthday
self._id = ident
Person._num += 1#每调用一次初始化,这个值都增加1,表示计数
def id(self): #定义简单的方法取出内部的属性值,相当于简单的getter方法
return self._id
def name(self):
return self._name
def sex(self):
return self._sex
def birthday(self):
return self._birthday
def 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 = name
def __lt__(self,another): #小于运算的方法要求另外的一个参数也是Person的实例
if not isinstance(another, Person):
raise PersonTypeError(another)
return self._id < another._id
@classmethod
def num(cls): #获取计数
return Person._num
def __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
@classmethod
def _id_gen(cls):
cls._id_num+=1
year = datetime.date.today().year
return "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 = department
self._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
@classmethod
def _id_gen(cls,birthday):
cls._id_num +=1
birth_year = datetime.date(*birthday).year
return "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 = 1720
self._depertment = "未定"
self._position = "未定"
def set_salary(self,amount):
if not type(amount) is int:
raise TypeError
self._salary = amount
def set_posotion(self,position):
self._position = position
def set_department(self,department):
self._depertment = department
def 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 ... 
随机推荐
- json_decode和json_encode
			JSON出错:Cannot use object of type stdClass as array解决方法php再调用json_decode从字符串对象生成json对象时,如果使用[]操作符取数据, ... 
- STM32的PWM输出极性的问题
			又开始玩PWM, 先试了一下PWM的两个引脚输出相反极性, 但是分析仪上看到, 两个脚是一样一样的. 写是这么写的: ... TIM_OCInitStructure.TIM_OCMode=TIM_OC ... 
- Unicode : RLO
			分类:备忘,Unicode,Perl 我们一般的输入文字的方向是从左往右,但是世界上总有特例,阿拉伯国家是从右到左的书写方式.经常看到微信里面好友得瑟,也就拿过来总结一下. 每个语言都能实现字符串反转 ... 
- listview 滑动以后设置最上面一行为整行展示
			需求: listview显示的第一行永远为整行,不能为半行. 参考: android listview 每次滑动整行 1. 添加 listview 的 setOnScrollListener() 事件 ... 
- Linux计划任务,自动删除n天前的旧文件【转】
			转自:http://blog.csdn.net/jehoshaphat/article/details/51244237 转载地址:http://yaksayoo.blog.51cto.com/510 ... 
- In_interrupt( ) 和In_irq( )【转】
			转自:http://blog.csdn.net/do2jiang/article/details/5486888 in_interrupt() 是判断当前进程是否处于中断上下文,这个中断上下文包括底半 ... 
- PHP正则表达式的使用
			1. 正则表达式的主要作用是:分割.匹配.查找.替换2. 正则表达式中包括的元素:原子(普通字符:a-z A-Z 0-9 .原子表.转义字符),元字符(有特殊功能的字符),模式修正符(系统内置部分字符 ... 
- POSTGRESQL9.5之pg_rman工具
			pg_rman是一款专门为postgresql设计的在线备份恢复的工具.其支持在线和基于时间点备份方式,还可以通过创建backup catalog来维护DB cluster备份信息. 看起来好像是模仿 ... 
- mysql5.5.x升级到mysql5.6.x
			大概步骤是: 把配置文件添加:skip-grant-tables参数,把basedir升级成新版本,启动mysql,执行命令:mysql_upgrade升级一下字典信息,然后flush privile ... 
- 20145227 《Java程序设计》第6周学习总结
			20145227 <Java程序设计>第6周学习总结 教材学习内容总结 第十章 输入/输出 10.1 InputStream与OutputStream 1.串流设计的概念 Java将输入/ ... 
