1.面向对象:

1.1什么是类?

类:把一类事物的相同的特征和动作整合到一起就是类,类是一个抽象的概念;

1.2什么是对象?

对象:就是基于类而创建的一个具体事物(具体存在的)也是特征和动作整合到一起的;

类属性包含:数据属性,函数属性;

属性分为两种:数据属性和函数属性

实例没有函数属性;

2.类属性的增删改查;

1类的查询,传参

  1. class school:
  2. def __init__(self,name,addr,type):
  3. self.mingzi = name
  4. self.dizhi = addr
  5. self.leixing = type
  6. def kao_shi(self):
  7. print("%s 学校要考试!!" % self.mingzi)
  8. def zhao_sheng(self):
  9. print("%s%s%s 正在招生" % (self.country, self.leixing, self.dizhi))
  10. # 传参
  11. s1 = school("清华","清华园","国营")
  12. # 从类中取出数据属性;
  13. print("国家:", s1.country)
  14. print("校名:", s1.mingzi)
  15. # 从类中查看函数属性;
  16. s1.kao_shi()
  17. s1.zhao_sheng()

输出:

  1. 国家: China
  2. 校名: 清华
  3. 清华 学校要考试!!
  4. China国营清华园 正在招生

2.2向类中增加,数据属性:

  1. class School:
  2. def __init__(self,name,addr,type):
  3. self.mingzi = name
  4. self.dizhi = addr
  5. self.leixing = type
  6. def kao_shi(self):
  7. print("%s 学校要考试!!" % self.mingzi)
  8. def zhao_sheng(self):
  9. print("%s%s%s 正在招生" % (self.country, self.leixing, self.dizhi))
  10. # 增加
  11. School.tuan = "共青团"
  12. print(School.tuan)

输出:

  1. 共青团

2.3向类修改,数据属性:

  1. class School:
  2. def __init__(self,name,addr,type):
  3. self.mingzi = name
  4. self.dizhi = addr
  5. self.leixing = type
  6. def kao_shi(self):
  7. print("%s 学校要考试!!" % self.mingzi)
  8. def zhao_sheng(self):
  9. print("%s%s%s 正在招生" % (self.country, self.leixing, self.dizhi))
  10. # 修改
  11. School.country="日本"
  12. print(School.country)

输出:

  1. 日本

2.4向类删除,数据属性:

  1. class School:
  2. def __init__(self,name,addr,type):
  3. self.mingzi = name
  4. self.dizhi = addr
  5. self.leixing = type
  6. def kao_shi(self):
  7. print("%s 学校要考试!!" % self.mingzi)
  8. def zhao_sheng(self):
  9. print("%s%s%s 正在招生" % (self.country, self.leixing, self.dizhi))
  10. # 删除
  11. del School.country
  12. print(School.country)

输出:

  1. ERROR:AttributeError: type object 'School' has no attribute 'country'

3.函数属性的增删改查;

3.1函数属性的增加

  1. class School:
  2. country = "China"
  3. def __init__(self,name,addr,type):
  4. self.mingzi = name
  5. self.dizhi = addr
  6. self.leixing = type
  7. def kao_shi(self):
  8. print("%s 学校要考试!!" % self.mingzi)
  9. def zhao_sheng(self):
  10. print("%s%s%s 正在招生" % (self.country, self.leixing, self.dizhi))
  11. s1 = School("清华", "清华园", "国营")
  12. # 增加函数属性,并调用增加的函数属性
  13. def eat_food(self, food):
  14. print("%s 正在吃 %s" % (self.mingzi, food))
  15. School.eat = eat_food
  16. s1.eat("水果")
  17. School.eat(s1, "水果")

输出:

  1. 清华 正在吃 水果
  2. 清华 正在吃 芒果

3.2函数属性的修改(重新定义一个,覆盖即可)

  1. class School:
  2. country = "China"
  3. def __init__(self,name,addr,type):
  4. self.mingzi = name
  5. self.dizhi = addr
  6. self.leixing = type
  7. def kao_shi(self):
  8. print("%s 学校要考试!!" % self.mingzi)
  9. def zhao_sheng(self):
  10. print("%s%s%s 正在招生" % (self.country, self.leixing, self.dizhi))
  11. s1 = School("清华", "清华园", "国营")
  12. # 修改
  13. def test(self):
  14. print("test %s 不愿意考试!!" % self.mingzi)
  15. School.kao_shi = test
  16. # 调用kao_shi()
  17. s1.kao_shi()

输出:

  1. test 清华 不愿意考试!!

4.实例属性的增删改查(就是对象)

4.1实例属性的生成和查看

  1. class Chinese:
  2. country = "China"
  3. def __init__(self,name):
  4. self.mingzi = name
  5. def play_ball(self,ball):
  6. print("%s 正在打 %s" %(self.mingzi, ball))
  7. # 生成一个实例
  8. p1 = Chinese("李雷")
  9. # 查看实例的实例属性
  10. print(p1.__dict__)
  11. print(p1.mingzi)

输出:

  1. {'mingzi': '李雷'}
  2. 李雷

4.2实例数据 属性的增加和查看

  1. class Chinese:
  2. country = "China"
  3. def __init__(self,name):
  4. self.mingzi = name
  5. def play_ball(self,ball):
  6. print("%s 正在打 %s" %(self.mingzi, ball))
  7. p1 = Chinese("李雷")
  8. print(p1.__dict__)
  9. # 增加'age': 18
  10. p1.age = 18
  11. print(p1.__dict__)
  12. print(p1.age)

输出:

  1. {'mingzi': '李雷'}
  2. {'age': 18, 'mingzi': '李雷'}
  3. 18

4.3实例数据 属性的修改

  1. class Chinese:
  2. country = "China"
  3. def __init__(self,name):
  4. self.mingzi = name
  5. def play_ball(self,ball):
  6. print("%s 正在打 %s" %(self.mingzi, ball))
  7. p1 = Chinese("李雷")
  8. print(p1.__dict__)
  9. # 修改'age': 19,直接覆盖
  10. p1.age = 18
  11. p1.age = 19
  12. print(p1.__dict__)
  13. print(p1.age)

输出

  1. {'age': 19, 'mingzi': '李雷'}
  2. 19

4.4实例数据 属性的删除

  1. class Chinese:
  2. country = "China"
  3. def __init__(self,name):
  4. self.mingzi = name
  5. def play_ball(self,ball):
  6. print("%s 正在打 %s" %(self.mingzi, ball))
  7. p1 = Chinese("李雷")
  8. print(p1.__dict__)
  9. p1.age = 19
  10. # 删除age
  11. del p1.age
  12. print(p1.__dict__)

输出:

  1. {'mingzi': '李雷'}

5.容易误导的地方:

5.1在修改p1.country = "日本"的时候,其实是在给实例赋值;在__init__中定义一个字典,并不会影响类的country值;

  1. class Chinese:
  2. country = "China"
  3. def __init__(self,name):
  4. self.mingzi = name
  5. def play_ball(self,ball):
  6. print("%s 正在打 %s" %(self.mingzi,ball))
  7. p1 = Chinese("李雷")
  8. print(p1.country)
  9. # 在p1实例字典中 __init__ 添加country = "日本" 和 类中的country没有关系
  10. p1.country = "日本"
  11. print(p1.__dict__)
  12. print(Chinese.country)
  13. print(p1.country)

输出:

  1. China
  2. {'mingzi': '李雷', 'country': '日本'}
  3. 类里的country: China
  4. 实例的country: 日本

5.2当在类中定义了列表,向列表中添加值

  1. class Chinese:
  2. country = "China"
  3. l = ["a", "b"]
  4. def __init__(self,name):
  5. self.mingzi = name
  6. def play_ball(self,ball):
  7. print("%s 正在打 %s" % (self.mingzi, ball))
  8. p1 = Chinese("李雷")
  9. print(p1.l)
  10. # 添加“c”到列表中:
  11. p1.l.append("c")
  12. print(p1.__dict__)
  13. print(Chinese.l)

输出:

  1. ['a', 'b']
  2. {'mingzi': '李雷'}
  3. ['a', 'b', 'c']

6.静态属性、类方法、静态方法:

1.静态属性,在一个函数前面加上property,把函数封装成数据属性的形式,在外部调用时看不出内部的逻辑关系;

静态属性特点:静态属性既可以访问实例属性,又可以访问类的属性;

2.类方法:在一个函数前面加上classmethod,这个函数的参数默认被写为cls,cls代表类

类的数据属性,类的函数属性,不能访问实例的属性;

3.静态方法:在一个函数前面加上staticmethod,这个函数可以有参数,但是不能访问类属性,也不能访问实例属性,属于自己;叫做类的工具包

6.1通过@property 装饰器功能将,函数属性隐藏为数据属性的调用;

  1. class Room:
  2. def __init__(self, name, zhuren, kuan, chang, gao):
  3. self.name = name
  4. self.zhuren = zhuren
  5. self.kuan = kuan
  6. self.chang = chang
  7. self.gao = gao
  8. # def jisuan(self):
  9. @property
  10. def jisuan(self):
  11. return "%s 住在 %s 房间面积是:%s" % (self.zhuren, self.name, self.kuan * self.chang)
  12. # 将函数内的数据return返回给jisuan
  13. r1 = Room("天上人间", "李雷", 20, 30, 4.5)
  14. print(r1.jisuan)
  15. print(r1.name)

输出:

  1. 李雷 住在 天上人间 房间面积是:600
  2. 天上人间

6.2通过@classmethod装饰器,跟实例没有任何的关系,只是类级别的操作,类调用自己的方法

classmethod就是给类调用类属性用的;

  1. class Room:
  2. tag = "tag_v1.0"
  3. def __init__(self, name, zhuren, kuan, chang, gao):
  4. self.name = name
  5. self.zhuren = zhuren
  6. self.kuan = kuan
  7. self.chang = chang
  8. self.gao = gao
  9. @classmethod
  10. def tell_info(cls, x):
  11. print(cls)
  12. print("=====>", cls.tag, x)
  13. Room.tell_info("haha")

输出:

  1. <class '__main__.Room'>
  2. =====> tag_v1.0 haha

6.3静态方法:自己访问自己,属于类的工具包,不跟类绑定也不更具体的实例绑定;不能调用类的属性cls 和 实例属性self:

  1. class Room:
  2. tag = "tag_v1.0"
  3. def __init__(self, name, zhuren, kuan, chang, gao):
  4. self.name = name
  5. self.zhuren = zhuren
  6. self.kuan = kuan
  7. self.chang = chang
  8. self.gao = gao
  9. @staticmethod # 类的工具包,不跟类绑定,也不跟具体的实例绑定
  10. def wash_body(a, b, c):
  11. print("%s %s %s 正在洗澡" % (a, b, c))
  12. r1 = Room("天上人间", "李雷", 20, 30, 4.5)
  13. Room.wash_body("李雷", "韩梅梅", "小明")
  14. r1.wash_body("李雷", "韩梅梅", "小明")

输出:

  1. 李雷 韩梅梅 小明 正在洗澡
  2. 李雷 韩梅梅 小明 正在洗澡

7.组合

定义一个人的类,人有头,躯干,手,脚等数据属性,这几个属性又可以是通过一个类实例化的对象,这就叫做组合;

用途:

1.做关联

2.小的组成大的

7.1 在两个不同的类中将学校和课程关联起来

  1. class School:
  2. def __init__(self, name, addr):
  3. self.name = name
  4. self.addr = addr
  5. def zhao_sheng(self):
  6. print("%s 正在 %s 招生" % (self.name, self.addr))
  7. class KeCheng:
  8. def __init__(self, name, xuefei, date_time, school):
  9. self.name = name
  10. self.xuefei = xuefei
  11. self.date_time = date_time
  12. self.school = school
  13. s1 = School("oldboy", "北京")
  14. s2 = School("oldboy", "南京")
  15. s3 = School("oldboy", "东京")
  16. # c1 = KeCheng("linux", 10000, "60day", s1)
  17. msg = '''
  18. 1 天上人间 北京校区
  19. 2 天上人间 南京校区
  20. 3 天上人间 东京校区
  21. '''
  22. while True:
  23. print(msg)
  24. menu_dic = {
  25. "1": s1,
  26. "2": s2,
  27. "3": s3
  28. }
  29. choice = input("选择学校>>:")
  30. school_object = menu_dic[choice]
  31. name = input("你的课程>>:")
  32. xuefei = input("你的学费>>:")
  33. date_time = input("你的课时>>:")
  34. new_course = KeCheng(name, xuefei, date_time, school_object)
  35. print("课程【%s】属于【%s】学校" % (new_course.name, new_course.school.name))

7.2 组合:将课程对象,添加到学生对象和老师对象中

  1. class QinghuaPeople:
  2. school = 'Qinghua'
  3. def __init__(self, name, age, sex):
  4. self.name = name
  5. self.age = age
  6. self.sex = sex
  7. def eat(self):
  8. print('is eating')
  9. class QinghuaStudent(QinghuaPeople):
  10. def __init__(self, name, age, sex):
  11. QinghuaPeople.__init__(self, name, age, sex)
  12. self.course = []
  13. def learn(self):
  14. print('%s is learning' % self.name)
  15. class QinghuaTeacher(QinghuaPeople):
  16. def __init__(self, name, age, sex, salary, title):
  17. QinghuaPeople.__init__(self, name, age, sex)
  18. self.salary = salary
  19. self.title = title
  20. self.course = []
  21. def teach(self):
  22. print('%s is teaching' % self.name)
  23. # 设置一个组合
  24. class Course:
  25. def __init__(self, course_name, course_period, course_price):
  26. self.course_name = course_name
  27. self.course_period = course_period
  28. self.course_price = course_price
  29. def tell_info(self):
  30. print('<课程名:%s 周期:%s 价格:%s>' % (self.course_name, self.course_period, self.course_price))
  31. # 定义的课程 Course 对象
  32. python = Course('Python', '6mons', 3000)
  33. linux = Course('Lnux', '3mons', 2000)
  34. bigdata = Course('BigData', '1mons', 1000)
  35. # 定义 Teacher 对象
  36. egen1 = QinghuaTeacher("egen", 18, "nv", 300, "军师")
  37. # 将课程追加到 Teacher 对象的 course 数据属性[]列表中
  38. egen1.course.append(python)
  39. egen1.course.append(linux)
  40. # 查看列表中包含哪些 内容
  41. for i in egen1.course:
  42. # 通过 调用 tell_info() 函数属性 打印出来
  43. i.tell_info()
  44. # 定义 Student 属性
  45. xiaoming = QinghuaStudent("xiaoming",19,"nan")
  46. # 将课程追加到 Student 对象的 course 数据属性[] 列表中
  47. xiaoming.course.append(python)
  48. xiaoming.course.append(bigdata)
  49. # 学生的课程信息
  50. for i in xiaoming.course:
  51. i.tell_info()

输出:

  1. <课程名:Python 周期:6mons 价格:3000>
  2. <课程名:Lnux 周期:3mons 价格:2000>
  3. <课程名:Python 周期:6mons 价格:3000>
  4. <课程名:BigData 周期:1mons 价格:1000>

8.继承

1.什么是继承

继承就像是,子类继承父类的特性;

2.单继承于多继承

单继承将一个父类的继承,多继承将多个父类继承到自身;

8.1什么时候用继承

当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好!

  1. class Animal:
  2. def eat(self):
  3. print("%s 吃" % self.name)
  4. def drink(self):
  5. print("%s 喝" % self.name)
  6. def shit(self):
  7. print("%s 拉" % self.name)
  8. def pee(self):
  9. print("%s 撒" % self.name)
  10. class Cat(Animal):
  11. def __init__(self,name):
  12. self.name = name
  13. self.breed = "猫"
  14. def cry(self):
  15. print("喵喵叫")
  16. class Dog(Animal):
  17. def __init__(self,name):
  18. self.name = name
  19. self.breed = "狗"
  20. def cry(self):
  21. print("汪汪叫")
  22. c1 = Cat("小白家的小黑猫")
  23. c1.eat()
  24. c2 = Cat("小黑家的小白猫")
  25. c2.drink()
  26. d1 = Dog("胖子家的小瘦狗")
  27. d1.shit()

输出:

  1. 小白家的小黑猫
  2. 小黑家的小白猫
  3. 胖子家的小瘦狗

8.2接口继承

1.什么是接口

接口就是一个函数,接口继承的含义就是定义一个基类,基类中将自己的方法定义成接口函数,利用@abc.abstractmethod,这样只要来一个之类就必须 实现这个方法否则无法实例化;

用于定义接口函数,定义一个基类,如若将自己的方法定义@abc.abstractmethod 接口函数

2.如例子:

将All_file定义为一个基类,将函数read和write定义为接口函数;

其子类继承基类,必须实现read和write函数的功能,才能实例化;

基类用于规范,可以不用实例化,用子类的实现功能。

  1. import abc
  2. class All_file(metaclass=abc.ABCMeta):
  3. @abc.abstractmethod
  4. def read(self):
  5. pass
  6. @abc.abstractmethod
  7. def write(self):
  8. pass
  9. class Disk(All_file):
  10. def read(self):
  11. print("Disk read")
  12. def write(self):
  13. print("Disk write")
  14. class Mem(All_file):
  15. def read(self):
  16. print("Mem read")
  17. def write(self):
  18. print("Mem write")
  19. m1 = Mem()
  20. m1.read()
  21. m1.write()

8.3子类调用 父类的方法,派生super():

1.子类继承了父类的方法,然后想基于原有的基础上修改,那么就需要在子类中调用父类的方法;使用super()指定父类的方法:

  1. class Vehichle:
  2. Country = "China"
  3. def __init__(self, name, speed, load, power):
  4. self.name = name
  5. self.speed = speed
  6. self.load = load
  7. self.power = power
  8. def run(self):
  9. print("地铁开动了")
  10. class Subway(Vehichle):
  11. def __init__(self, name, speed, load, power, line):
  12. super().__init__(name, speed, load, power)
  13. self.line = line
  14. def run(self):
  15. super().run()
  16. print("%s %s 开动了" % (self.name, self.line))
  17. s1 = Subway("北京地铁", "80迈", "10000人", "电", 2)
  18. s1.run()

输出:

  1. 地铁开动了
  2. 北京地铁 2 开动了

009-Python-面向对象的更多相关文章

  1. python 面向对象初级篇

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

  2. Python 面向对象 基础

    编程范式概述:面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现 ...

  3. python面向对象进阶(八)

    上一篇<Python 面向对象初级(七)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  4. python 面向对象(进阶篇)

    上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  5. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

  6. Python面向对象详解

    Python面向对象的"怜人之处" Python的待客之道--谁能进来 Python的封装--只给你想要的 Python的继承--到处认干爹 Python的多态--说是就是

  7. python 面向对象和类成员和异常处理

    python 面向对象 你把自己想象成一个上帝,你要创造一个星球,首先你要把它揉成一个个球,两个直径就能创造一个球 class star: '''名字(name),赤道直径(equatorial di ...

  8. python 面向对象学习

    ------Python面向对象初 下面写一个类的简单实用,以便方便理解类 #python 3.5环境,解释器在linux需要改变 #阅读手册查询readme文件 #作者:S12-陈金彭 class ...

  9. 初识python面向对象

    一.初识python面向对象: class Person: #使用class关键字定义一个类 age=0 #类变量(静态变量) def eat(self,food): #定义一个方法 self.age ...

  10. python 面向对象、特殊方法与多范式、对象的属性及与其他语言的差异

    1.python 面向对象 文章内容摘自:http://www.cnblogs.com/vamei/archive/2012/06/02/2532018.html   1.__init__() 创建对 ...

随机推荐

  1. P2805 [NOI2009]植物大战僵尸

    题目地址:P2805 [NOI2009]植物大战僵尸 最大权闭合子图 若有向图 \(G\) 的子图 \(V\) 满足: \(V\) 中顶点的所有出边均指向 \(V\) 内部的顶点,则称 \(V\) 是 ...

  2. HBSX2019 3月训练

    Day 1 3月有31天废话 今天先颓过了就只剩30天了 初步计划 每天一道字符串/数据结构题 图论学习 根据<若干图论模型探讨>(lyd)复习 二分图与网络流学习 <算法竞赛进阶指 ...

  3. MySql联合查询

    将多条查询语句的结果合并为一个结果 *多表查询是横向连接,联合查询是纵向连接. 语法: 查询语句1 union 查询语句2 union 查询语句3 *union关键字默认去重,union all包含重 ...

  4. 题解-TIOJ1905 最理想的身高差

    Problem 题目原型 题目大意:求区间最小差值 序列长度\(1e5\),询问\(2e5\) Solution 总体思路就是找出所有可能作为答案的点对,用资料结构_(:зゝ∠)_维护,然后询问 至于 ...

  5. window.opener和window.open的使用

    window.opener和window.open的使用 window.opener是指调用window.open方法的窗口.window.opener 返回的是创建当前窗口的那个窗口的引用,比如点击 ...

  6. hibernate框架学习之对象状态

    lHibernate对象共有三种状态 •瞬时状态:瞬时对象 •持久化状态:持久化对象 •托管状态:托管对象 l瞬时对象(Transient Object),简称TO l瞬时对象指的是应用程序创建出来的 ...

  7. web@css普通布局 , 高级布局 , 布局坑

    1.高级布局<文档流概念>:页面从上至下,块式标签一行一行排列,内联式一行中从左至右排列<BFC规则>:左右位置(左右margin)垂直位置(上下margin)容器内外(互不影 ...

  8. js混淆、eval解密

    js中的eval()方法就是一个js语言的执行器,它能把其中的参数按照JavaScript语法进行解析并执行,简单来说就是把原本的js代码变成了eval的参数,变成参数后代码就成了字符串,其中的一些字 ...

  9. Python-递归、三元表达式列表生成式等

    一.函数递归 1.什么是函数递归:函数的递归调用是函数嵌套的一种特殊形式,在调用一个函数的过程中又直接或者间接地调用该函数本身,称之为函数的递归调用 2.递归调用必须明确的两个阶段: 1.回溯:一次次 ...

  10. 关于在CentOS上,绘图丢失部分中文字的问题

    官方的system.drawing.common 第三方的 zkweb.system.drawing,都用的是libgdiplus 只要是自己编译libgdiplus,都会有这个问题, 问题 : 这里 ...