面向对象:

面向对象:
世界万物,皆可分类
世界万物,皆为对象
 
只要是对象,就肯定属于某种品类
只要是对象,就肯定有属性
 
 
 
 
特性:

多态:

一个统一的接口,多种实现
 例如:  一个公司 有程序员,销售,前台,但是他们都属于员工
          老板只需说工作, 那么下面的员工就开始各自的工作,不管你是程序猿,前台 都会各自做各自的事情

定义语法:
 
#定义一个狗类型
class  Dog:
          def bulk(self):          #会叫
                print("汪汪汪")
 
 
#创建一个狗
dog1 = Dog()
 
#创建多个狗:
dog2 = Dog()
dog3 = Dog()
 
 
#就为了传名字
 

构造函数:
#在实际化时做一些类的初始化的工作.
 
 

就是把 r1 这个变量名传进去类里了

self  就是你创建的对象的变量名

实践:

 class Role:
def __init__(self,name,role,weapon,life_value=100,money=15000):
self.name = name
self.role = role
self.weapon = weapon
self.life_value = life_value
self.money = money
def shot(self):
print("shotting ...")
def got_shot(self):
print("ah .... ,i got shot ...")
def buy_gun(self,gun_name):
print("{_name} buy the {_gun_name} gun".format(_name=self.name,_gun_name=gun_name))
r1 = Role("Alex","F","ak-47")
r2 = Role("小明","T","m4-a1")
r1.buy_gun("m4")
r2.got_shot()

运行结果:

实例变量:
也就是静态属性:
方法:
也就是动态属性

类变量:

新加变量:

默认去找实例变量,找不到实例变量才去找类变量

r1添加变量,r2 实例化不变,因为是r1 添加变量

改变类变量,如果实例里没有那个变量,那么就会跟着改变

对于list  会导致所有的改变

实验:
验证 字符串及其他变量的区别:
 class Role:
n = 123
n_lsit = []
def __init__(self,name,role,weapon,life_value=100,money=15000):
self.name = name
self.role = role
self.weapon = weapon
self.life_value = life_value
self.money = money
def shot(self):
print("shotting ...")
def got_shot(self):
print("ah .... ,i got shot ...")
def buy_gun(self,gun_name):
print("{_name} buy the {_gun_name} gun".format(_name=self.name,_gun_name=gun_name))
r1 = Role("Alex","F","ak-47")
r2 = Role("小明","T","m4-a1")
# r1.buy_gun("m4")
#
# r2.got_shot()
print("r1",r1.n,r1.n_lsit)
print("r2",r2.n,r2.n_lsit)
r1.n = "heh1"
r2.n = "hah2"
print("Class:",Role.n,Role.n_lsit)
r1.n_lsit.append("r11")
print("r1",r1.n,r1.n_lsit)
r2.n_lsit.append("r22")
print("r2",r2.n,r2.n_lsit)
print("Class:",Role.n,Role.n_lsit)
print("r1",r1.n,r1.n_lsit)

运行结果:

得出:
1 实例变量:  就是每个实例的特有属性
2 类变量:     就是大家共用的属性,节省内存开销, 如下两个的区别即是

 
 
析构函数:
在实例释放、销毁的时候自动执行的,通常用于做一些收尾工作,比如:
     1 关闭数据库连接
     2 关闭打开的临时文件

写一个:

如果在这之前就del  那么就会提前执行,也就是这个会在一个实例销毁时执行的

私有属性:
 
例如生命值,只有自己可以访问,别人不能调用也不能访问:
 
把这个变量隐藏了,对外不可用

外面想要查看,那么就定义一个函数然后在外面来调用这个函数即可

当然外面的不能访问,必然不能修改,所以想修改就要在里面定义好修改的方式,如下:

私有方法:
同上,把对应的方法前加__ 就不能在外面调用了,只能在里面调用:

实践 私有属性:

 class Role:
n = 123
n_lsit = []
def __init__(self,name,role,weapon,life_value=100,money=15000):
self.name = name
self.role = role
self.weapon = weapon
self.__life_value = life_value
self.money = money
def shot(self):
print("shotting ...")
def got_shot(self):
print("ah .... ,i got shot ...")
def show_life_value(self):
print("{_name}'s life value is {_life_value}".format(_name=self.name,
_life_value=self.__life_value))
def buy_gun(self,gun_name):
print("{_name} buy the {_gun_name} gun".format(_name=self.name,_gun_name=gun_name))
r1 = Role("Alex","F","ak-47")
r2 = Role("小明","T","m4-a1")
r1.buy_gun("m4")
r2.got_shot()
r1.show_life_value()
r2.show_life_value()

实践 私有方法:
同上,如果在外面调用此方法就会提示错误:

正确方式就是在类里定义另一个方法来调用这个方法:

 class Role:
n = 123
n_lsit = []
def __init__(self,name,role,weapon,life_value=100,money=15000):
self.name = name
self.role = role
self.weapon = weapon
self.__life_value = life_value
self.money = money
def shot(self):
print("shotting ...")
def __got_shot(self):
print("ah .... ,i got shot ...")
self.__life_value -= 50
def show_life_value(self):
print("{_name}'s life value is {_life_value}".format(_name=self.name,
_life_value=self.__life_value))
def buy_gun(self,gun_name):
print("{_name} buy the {_gun_name} gun".format(_name=self.name,_gun_name=gun_name))
def out_shot(self):
print("调用里面的私有方法被射中...")
self.__got_shot()
r2 = Role("小明","T","m4-a1")
r2.out_shot()
r2.show_life_value()

封装  就是把实现的方式内部用私有方法,私有变量实现
 
继承  
写一个大类:
class People:
 
 
 
写一个男人:

增加新功能,并先调用父类方法:

这就等于重构了父类的方法

创建一个woman:

实践:

 class People:
def __init__(self,name,age):
self.name = name
self.age = age
def eat(self):
print("{_name} is eatting ...".format(_name=self.name))
def sleep(self):
print("{_name} is sleepping ...".format(_name=self.name))
class Man(People):
def piao(self): #添加新的方法,这个方法只能是这个类来用
print("{_name} can piaoing ...".format(_name=self.name))
def sleep(self): #修改父类里的方法,添加功能,实现个性化
People.sleep(self)
print("给睡觉添加新的功能")
class Woman(People):
def sheng(self): #添加新的方法,这个方法只能是这个类来用
print("{_name} can shenghaizi ...".format(_name=self.name))
m1 = Man("小明",22)
w1 = Woman("小花",18)
print("m1")
m1.sleep()
print("w1")
w1.sleep()
print("m1")
m1.piao()
print("w1")
w1.sheng()

子类中的初始化:
对构造函数进行重构:

父类的所有参数都要写一遍,写完后面加自己的初始化变量

 下面功能一样: 更方便一些。当大类修改了后子类不需要修改
 

 
类:
新式和经典的区别就是新式和经典的多继承不一样了
 

 多继承,  python  支持,  有的语言支持,有的语言不支持
 
 

 实践:

 class People:
def __init__(self,name,age):
self.name = name
self.age = age
def eat(self):
print("{_name} is eatting ...".format(_name=self.name))
def sleep(self):
print("{_name} is sleepping ...".format(_name=self.name))
class Action(object):
def make_friends(self,object):
print("{_name} is making from {_obj_name}".format(_name=self.name,
_obj_name=object.name))
class Man(People,Action):
def piao(self): #添加新的方法,这个方法只能是这个类来用
print("{_name} can piaoing ...".format(_name=self.name))
def sleep(self): #修改父类里的方法,添加功能,实现个性化
People.sleep(self)
print("给睡觉添加新的功能")
class Woman(People):
def sheng(self): #添加新的方法,这个方法只能是这个类来用
print("{_name} can shenghaizi ...".format(_name=self.name))
m1 = Man("小明",22)
w1 = Woman("小花",18)
m1.make_friends(w1)

扩展版:

 #!/usr/bin/env python3
# Author: Shen Yang
class People:
def __init__(self,name,age):
self.name = name
self.age = age
def eat(self):
print("{_name} is eatting ...".format(_name=self.name))
def sleep(self):
print("{_name} is sleepping ...".format(_name=self.name))
class Action(object):
def make_friends(self,object):
print("{_name} is making from {_obj_name}".format(_name=self.name,
_obj_name=object.name))
self.firends.append(object)
def pay_money(self,object):
print("{_name} giveing {_obj_name} {_money} money".format(_name=self.name,
_obj_name=object.name,
_money=self.money))
class Man(People,Action):
firends = []
def __init__(self,name,age,money):
super(Man,self).__init__(name,age)
self.money = money
def piao(self): #添加新的方法,这个方法只能是这个类来用
print("{_name} can piaoing ...".format(_name=self.name))
def sleep(self): #修改父类里的方法,添加功能,实现个性化
People.sleep(self)
print("给睡觉添加新的功能")
class Woman(People):
def sheng(self): #添加新的方法,这个方法只能是这个类来用
print("{_name} can shenghaizi ...".format(_name=self.name))
m1 = Man("小明",22,6800)
w1 = Woman("小花",18)
m1.make_friends(w1)
m1.pay_money(w1)
w1.name ="小花花"
print(m1.firends[0].name)

多继承的顺序问题:
 
新式类 :
只继承第一个 的初始化__init__
 
 
 
构造方法查找顺序:
1 广度优先  先找同一级的同一级的没有才往更上一级查找
2 深度优先 查找上级,上级没有就会往更上一级查找
 
 
python3 中的经典类和新式类都是广度优先:
python2 的经典类是按 深度优先  继承,新式类是按 广度优先 继承。。。。。。
 
这就是最大区别
 
 
object 是所有类的类:
 
class SchoolMember(object):
 写一个学校,员工,学生的对象程序:

 #!/usr/bin/env python3
# Author: Shen Yang
#object 是所有类的类:
class School(object):
def __init__(self,name,addr):
self.name = name
self.addr = addr
self.students = []
self.staffs = []
def enroll(self,stu_obj):
print("为{_stu_obj} 办理了入学手续。。。".format(_stu_obj=stu_obj.name))
self.students.append(stu_obj)
def hire(self,staff_obj):
print("雇佣了新员工 {_staff_obj}".format(_staff_obj=staff_obj.name))
self.staffs.append(staff_obj)
class SchoolMember(object):
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def tell(self):
pass
class Student(SchoolMember):
def __init__(self,name,age,sex,stu_id,grade):
super(Student,self).__init__(name,age,sex)
self.stu_id = stu_id
self.grade = grade
def tell(self):
print('''
----- info of Student: {_name} -----
Name:{_name}
Age:{_age}
Sex:{_sex}
Stu_id:{_stu_id}
Grade:{_grade}
'''.format(_name=self.name,_age=self.age,_sex=self.sex,_stu_id=self.stu_id,_grade=self.grade))
def pay_tuition(self,amount):
print("{_name} has paid tuition {_amount}".format(_name=self.name,_amount=amount))
class Teacher(SchoolMember):
def __init__(self,name,age,sex,salary,coure):
super(Teacher,self).__init__(name,age,sex)
self.salary = salary
self.coure = coure
def tell(self):
print('''
----- info of Teacher: {_name} -----
Name:{_name}
Age:{_age}
Sex:{_sex}
Salary:{_salary}
Coure:{_coure}
'''.format(_name=self.name,_age=self.age,_sex=self.sex,_salary=self.salary,_coure=self.coure))
def teach(self):
print("{_name} has teach {_coure}".format(_name=self.name,_coure=self.coure))
#初始化一个学校
school = School("老男孩","沙河")
#初始化两个教师
t1 = Teacher("Oldboy",35,"M",20000,"Linux")
t2 = Teacher("Alex",22,"M",3000,"Python")
#初始化一个学生
s1 = Student("Yang",26,"M",1001,"Python")
#让第一个老师打印信息然后开始教课
t1.tell()
t1.teach()
#让第二个老师打印信息
t2.tell()
#让学生打印信息然后缴费
s1.tell()
s1.pay_tuition(6888)
#学校给学生办理入学手续
school.enroll(s1)
#打印学校学生
print(school.students[0].name)
school.hire(t1)
school.hire(t2)
for i in school.staffs:
print(i.name)

 多态:

 
 
 

day06 面向对象编程的更多相关文章

  1. Java面向对象编程基础

    一.Java面向对象编程基础 1.什么是对象?Object 什么都是对象! 只要是客观存在的具体事物,都是对象(汽车.小强.事件.任务.按钮.字体) 2.为什么需要面向对象? 面向对象能够像分析现实生 ...

  2. angular2系列教程(六)两种pipe:函数式编程与面向对象编程

    今天,我们要讲的是angualr2的pipe这个知识点. 例子

  3. 带你一分钟理解闭包--js面向对象编程

    上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...

  4. PHP 面向对象编程和设计模式 (1/5) - 抽象类、对象接口、instanceof 和契约式编程

    PHP高级程序设计 学习笔记 2014.06.09 什么是面向对象编程 面向对象编程(Object Oriented Programming,OOP)是一种计算机编程架构.OOP 的一条基本原则是计算 ...

  5. Delphi_09_Delphi_Object_Pascal_面向对象编程

    今天这里讨论一下Delphi中的面向对象编程,这里不做过多过细的讨论,主要做提纲挈领的描述,帮助自己抓做重点. 本随笔分为两部分: 一.面向对象编程 二.面向对象编程详细描述 ------------ ...

  6. python基础-面向对象编程

    一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 ...

  7. 面向对象编程(OOP)

    什么是面向对象编程,对于面向对象编程与面向过程编程的解释随处可见,个人认为对面向对象编程解释最好的一个定义是:依赖倒转原则是面向对象编程的标志,面向对象编程是一种思想,无论使用哪一种编程语言,如果在编 ...

  8. python 学习笔记7 面向对象编程

    一.概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." ...

  9. 进击的Python【第七章】:Python的高级应用(四)面向对象编程进阶

    Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 ...

随机推荐

  1. It is not the destination so much as the journey, they say.

    It is not the destination so much as the journey, they say. 人家说目的地不重要,重要的是旅行的过程.<加勒比海盗>

  2. python的subprocess模块(写的不错留作查询)

    python的subprocess模块 subprocess模块是python从2.4版本开始引入的模块.主要用来取代 一些旧的模块方法,如os.system.os.spawn*.os.popen*. ...

  3. Windows使用MySQL数据库管理系统中文乱码问题

    声明:本文关于MySQL中文乱码问题的解决方案均基于Windows 10操作系统,如果是Linux系统会有较多不适用之处,请谨慎参考. 一.MySQL中文乱码情况 1. sqlDevelper远程登陆 ...

  4. SharePoint Server 2016 WEB 网站浏览器支持

    SharePoint Server 2016支持多种常用的Web浏览器,如Internet Explorer,Google Chrome,Mozilla Firefox,Apple Safari和Mi ...

  5. 通过Jenkins调用自动部署war包及jar包到服务器上的Shell脚本

    1)部署war包#!/bin/bashif [ id>0];then echo"stopproject" kill −9 idelse echo "project ...

  6. 【Python图像特征的音乐序列生成】如何生成旋律(大纲),以及整个项目的全部流程

    今天连看三篇论文,不是很细致地看,也没有具体去实现,只是大概明白了一些新思路.这三篇论文,一篇概述了Decoder-Encoder模型,一篇延伸这个模型,首次提出了Attention机制,最后一篇详细 ...

  7. GWTDesigner_v5.1.0破解码

    GWTDesigner_v5.1.0_win32_x86.exe破解码,双击运行keygeno.jar,然后输入用户名.网卡MAC,然后单击Generate,将生成的文件放在C:\Documents ...

  8. .net后台使用post方式对指定地址的方法传值并且获取结果的方法

    /// <summary> /// .net 后台 post http地址请求 /// </summary> /// <param name="uri" ...

  9. Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] A A Problem about Polyline(数学)

    题目中给出的函数具有周期性,总可以移动到第一个周期内,当然,a<b则无解. 假设移动后在上升的那段,则有a-2*x*n=b,注意限制条件x≥b,n是整数,则n≤(a-b)/(2*b).满足条件的 ...

  10. 查看nvidia的GPU

    nvidia-smi就可以查看,可以看到进程的占用率,可以kill杀掉进程 注意这里的-前后都不要空格,连起来写