本节主要内容为面向对象。

一、面向对象的特征

Class 类
一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象的都具备的属性(variables(data))、共同的方法

Object 对象
一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同

Encapsulation 封装
在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法

Inheritance 继承
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承

Polymorphism 多态
态是面向对象的重要特性,简单点说:“一个接口,多种实现”,指一个基类中派生出了不同的子类,且每个子类在继承了同样的方法名的同时又对父类的方法做了不同的实现,这就是同一种事物表现出的多种形态。

二、封装

封装就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

下面看一个例子:

1 class Foo(object):#定义一个类,class是定义类的语法,Foo是类名,(object)是新式类的写法
2     def __init__(self,name,age): #初始化函数构建方法,在生成一个角色时要初始化的一些属性就填写在这里
3         self.name = name
4         self.age = age
5 obj1=Foo('csp',15) #实例化对象,将参数自动传给Foo下面的__init__(...)方法
6 obj2=Foo('zj',14)
7 print(obj1.name,obj1.age)
8 print(obj2)

View Code

结果输出:
csp 15
<__main__.Foo object at 0x0000000000A97DA0>

看另一个例子:

 1 class Foo:
 2     def __init__(self,name,age):
 3         self.name = name
 4         self.age = age
 5     def show(self):
 6         print (self.name)
 7         print (self.age)
 8 obj1 = Foo('haha',15)
 9 obj2 = Foo('kaokao',14)
10 obj1.show()
11 obj2.show()

View Code

结果输出:

haha
15
kaokao
14

三、继承与类的相互关联:

 1 # -*- coding:utf8 -*-
 2 class School(object):
 3     def __init__(self,name,addr):
 4         self.name = name
 5         self.adr = addr
 6         self.students=[]
 7         self.staffs=[]
 8     def enroll(self,stu_obj):
 9         print("为学员%s办理注册手续"%stu_obj.name)
10         self.students.append(stu_obj)
11     def hire(self,staff_obj):
12         self.staffs.append(staff_obj)
13         print("雇佣新员工%s"%staff_obj)
14 class SchoolMember(object):
15     def __init__(self,name,age,sex):
16         self.name =name
17         self.age = age
18         self.sex =sex
19     def tell(self):
20         print('''----info----''')
21 class Teacher(SchoolMember):
22      def __init__(self,name,age,sex,salary,course):
23          super(Teacher,self).__init__(name,age,sex)
24          self.salary = salary
25          self.course = course
26      def tell(self):
27          print('''
28          ------info of Teacher:%s------
29          Name:%s
30          Age:%s
31          Sex:%s
32          Salary:%s
33          Course:%s
34          '''%(self.name,self.name,self.age,self.sex,self.salary,self.course))
35      def teach(self):
36          print("%s is teaching course [%s]"% (self.name,self.course))
37 class Student(SchoolMember):
38     def __init__(self,name,age,sex,stu_id,grade):
39         super(Student,self).__init__(name,age,sex)
40         self.stu_id = stu_id
41         self.grade = grade
42     def tell(self):
43          print('''
44         ------info of Student:%s------
45          Name:%s
46          Age:%s
47          Sex:%s
48          Stu_id:%s
49          Grade:%s
50          '''%(self.name,self.name,self.age,self.sex,self.stu_id,self.grade))
51     def pry_tuition(self,amount):
52         print("%s has paid tution for $%s"%(self.name,amount))
53 school = School("laonanhaiIT","shahe")
54
55 t1=Teacher("Oldboy",56,"MF",200000,"Linux")
56 t2=Teacher("Alex",22,"M",3000,"Python")
57
58 s1=Student("chenronghua",36,"MF",1001,"Python")
59 s2=Student("xuliangwei",19,"F",1002,"Liux")
60
61 t1.tell()
62 s1.tell()
63 school.hire(t1.name)
64 school.enroll(s1)
65 #school.staffs[0].teach()
66 for stu in school.students:
67     stu.pry_tuition(5000)

View Code

输出结果:

------info of Teacher:Oldboy------
         Name:Oldboy
         Age:56
         Sex:MF
         Salary:200000
         Course:Linux

------info of Student:chenronghua------
         Name:chenronghua
         Age:36
         Sex:MF
         Stu_id:1001
         Grade:Python
        
雇佣新员工Oldboy
为学员chenronghua办理注册手续
chenronghua has paid tution for $5000

四、析构函数

上面我们已经知道构造函数__init__,具有初始化的作用,也就是当该类被实例化的时候就会执行该函数,那么我们就可以把要先初始化的属性放到这个函数里面。

那么与之对应的就是析构函数__del__,用于释放对象占用的资源的函数,做收尾工作,例如关闭数据库、打开临时文件等;

__del__()也是可选的,如果不提供,则Python 会在后台提供默认析构函数

如果要显式的调用析构函数,可以使用del关键字,方式如下:del对象名

示例:

 1 #-*- coding:utf-8 -*-
 2 class Role(object):
 3       n = 321
 4       name = "csp"
 5       def __init__(self,name,role,weapon,life_value=100,money=15000):#在初始化函数,在生成一个角色时要初始化的一些属性就填写在这里
 6           self.name = name
 7           self.role = role
 8           self.weapon = weapon
 9           self.__life_value = life_value
10           self.money = money
11       def shot(self): #类的方法(动态属性)
12           print ("shopping...")
13       def got_shot(self):
14           print("hh...,%s go shot..."%self.name)
15       def  got_gun(self,gun_name):
16           print("%s just bought %s"%(self.name,gun_name))
17       def  __del__(self):#析构函数
18           print("%s doned" % self.name)
19       def show_life_value(self): #查看私有属性的方法。
20           print("name:%s weapon:%s life_walue:%s"%(self.name ,self.weapon,self.__life_value))
21 r1 = Role('nidaye','police','AK47')
22 r1.got_gun("AK")
23 r1.got_shot()
24 del r1 #删除实例,这时候析构函数就要登场了。print("%s doned" % self.name)
25 r2 = Role('csp','terrorist','B22')
26 r2.got_shot()
27 print(r2.show_life_value())#因为想看私有属性就需要这样内部定义一个方法,内部调用
28 print(r1) #因为此实例已经删除再打印就报错了

View Code

输出结果:

nidaye just bought AK
hh...,nidaye go shot...
nidaye doned
hh...,csp go shot...
name:csp weapon:B22 life_walue:100
None

========下面就是打印实例r1的报错内容了======================
Traceback (most recent call last):
  File "C:/Users/Administrator/PycharmProjects/python/day6/练习/析构.py", line 28, in <module>
    print(r1)
NameError: name 'r1' is not defined

========我们析构函数一个谁谁done的函数嘛,下面r2结束执行的结果==============
csp doned

五、多态

多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
那么,多态的作用是什么呢?我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。
Pyhon不直接支持多态,但可以间接实现.

 1 # _*_ coding:utf-8 _*_
 2 class Animal:
 3     def __init__(self,name):
 4         self.name = name
 5     #经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法. 比如更改环境变量或者修改其他类的属性等能用到静态方法
 6     @staticmethod
 7     def animal_tal(obj):
 8              obj.talk()
 9 class Cat(Animal):
10     #猫叫
11     def talk(self):
12         print("The cat %s is mewing..." % self.name)
13
14 class Dog(Animal):
15     #狗吠
16     def talk(self):
17         print("The dog %s is baking..." % self.name)
18 c = Cat('huanhuan')
19 d=  Dog('songsong')
20 Animal.animal_tal(c)
21 Animal.animal_tal(d)

View Code

输出结果:

The cat huanhuan is mewing...
The dog songsong is baking...

转载于:https://www.cnblogs.com/chaishao/p/5827017.html

python基础(六)相关推荐

  1. 第六篇:python基础之文件处理

    第六篇:python基础之文件处理 阅读目录 一.文件处理流程 二.基本操作 2.1 文件操作基本流程初探 2.2 文件编码 2.3 文件打开模式 2.4 文件内置函数flush 2.5 文件内光标移 ...

  2. Python基础(六)--类与对象

    目录 Python基础(六)--类与对象 1 类与对象的基本概念 1.1 什么是对象 1.2 什么是类 1.3 类与对象的关系 2 定义与初始化 2.1 类的定义 2.2 对象的初始化 2.3 动态增 ...

  3. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  4. python基础-第六篇-6.2模块

    python之强大,就是因为它其提供的模块全面,模块的知识点不仅多,而且零散---一个字!错综复杂 没办法,二八原则抓重点咯!只要抓住那些以后常用开发的方法就可以了,哪些是常用的?往下看--找答案~ ...

  5. Python基础(六)—函数式编程(内部函数、闭包、lambda、filter/map/reduce/sorce、偏函数)

    内部函数 Python中函数的作用域由def关键字界定,函数内的代码访问变量的方式是从其所在层级由内向外,若往外直至全局作用域都查找不到的话代码会抛异常. 主要看以下代码的差别~~ "&qu ...

  6. 小白都能学会的Python基础 第六讲:综合实战2 - 大数据分词与词云图绘制

    1.华小智系列 - Python基础(案例版) <Python基础>目录 第六讲:综合实战2 - 大数据分词与词云图绘制 1.大数据分词技巧 2.词频统计技巧 3.词云图绘制 4.微博词云 ...

  7. 从零起步(无需数学和Python基础)编码实现AI框架之第六节课:使用Matrix编写AI框架实战及测试

    从零起步(无需数学和Python基础)编码实现AI框架之第六节课:使用Matrix编写AI框架实战及测试 本节课使用Matrix编写AI框架实战:编码实现Forward Propagation.Bac ...

  8. 《python基础教程》答案(第六章)

    <python基础教程>答案(第六章) # created by swy """ solutions to beginning python "&q ...

  9. Python基础知识点六万字总结,爆肝一周熬夜完成【建议收藏】

    大家好,我是辣条. 今天给大家带来Python基础知识点的总结,不夸张的说我一周才写完,这才是第一弹,如果大家喜欢记得三连呦,我会火速更新下一弹,争取把这个系列做完,希望得到大家的支持. 目录 注释 ...

  10. python基础学习(十六)——超详细!pickle模块的使用(pickle.dump()和pickle.load())

    python的pickle模块提供了一个简答的持久化功能,可以将对象以文件的形式存放在磁盘上. pickle模块实现了基本的数据序列化和反序列化 通过pickle模块的序列化操作pickle.dump ...

最新文章

  1. Html一修改就会自动刷新,web 前端修改 自动刷新 插件使用 liveReload
  2. Mercury的三件“利器”
  3. tkinter窗口居中方法
  4. aquamacs 夜间模式禁止滚动条
  5. svn由于连接方在一段时间后没有正确答复或连接的主机没有反应连接尝试失败...
  6. java与java ee_Java EE 8 MVC:全局异常处理
  7. Visual Studio进行linux远程开发
  8. python动态加载模块有什么用_人生苦短我用python(02)动态加载模块
  9. 如何在iOS 9中启用“应用程序传输安全性”的情况下加载HTTP URL? [重复]
  10. android studio控制台调试程序,Android Studio ADB网络调试汇总
  11. ApacheCN 翻译活动进度公告 2019.3.3
  12. JOHNSON算法:流水作业最优调度问题
  13. offline RL介绍
  14. 360 网站服务器漏洞扫描,360Webscan
  15. c语言程序转python_c语言转python
  16. 操作系统安全防范措施
  17. 2014巴西世界杯 不再有观众!
  18. Work Like Alibaba系列分享回顾整理(含演讲幻灯片、视频):持续更新中
  19. 树莓派耳机接口有电流声、杂音
  20. ios开发面试常见问题及答案

热门文章

  1. Inspur World 2018开发者论坛启动报名
  2. java狗具有特别的接飞盘的方法_如何让狗狗学会接飞盘?简单,这几个技巧让你事半功倍!...
  3. 顺丰同城公布发售结果:IPO定价位于下限,连年录得巨额亏损
  4. geany php,ubuntu 中geany调用浏览器展示php文件
  5. IDEA设置背景图片---全网最简单的操作
  6. 群晖Nas技巧 - windows通过网络邻居访问群晖nas无法访问
  7. 调研分析-全球与中国FAKRA射频连接器市场现状及未来发展趋势
  8. 【活动】腾讯2019 TLC 众多技术大咖等你参会,早鸟票5折售卖中
  9. 【C语言学习笔记】: 一维数组
  10. 域名竞拍要注意什么?