面向对象

1.什么是面向对象?
面向对象是一门编程思想! - 面向过程编程思想:
核心是 “过程” 二字,过程指的是解决问题的步骤,即先干什么再干什么!
基于该编程思想编写程序,就好比在设计一条工厂流水线,一种机械式的思维方式。 优点:
将复杂的问题流程化,进而简单化
缺点:
牵一发而动全身,程序的可扩展性差。 注意: 编程思想仅仅是一门思想,与任何的技术无关。 - 面向对象编程思想:
注意: 要将自己当做一个上帝!!!
核心是 “对象” 二字,对象指的是 “特征与技能” 的结合体。
基于该编程思想编写程序,就好比在创造世界,一种 “上帝式” 的思维方式。 优点:
可扩展性高。
缺点:
编写程序的复杂程度比面向过程高。 2.如何产生对象:
1) 什么是类?
类指的是类型、类别。 - 在两种角度去看待:
- 现实世界中:
- 先有一个个的对象,经过社会的文明发展,随之总结出类。
对象是实际存在的,而类抽象产生的。 - 在程序中:
- 必须先有类,再通过“调用类,产生对象”。 对象指的是 “特征与技能” 的结合体, 类指的是一系列 “对象之间相同的特征与技能” 的结合体。 2) 如何定义类:
- 如何写类并产生对象:
- 先从现实世界中通过一个个对象总结出类。
- 然后再定义类,后调用类产生对象。 - 比如: 选课系统:
- 选课系统学生类:
- 学生对象1:
特征:
- 姓名: 胡晨阳
- 性别: female
- 年龄: 95
- 学校: oldboy - 技能:
- 技术: python
- 学习: learn
- 选课: course
- 学生对象2:
特征:
- 姓名: 高弟
- 性别: female
- 年龄: 98
- 学校: oldboy
- 技能:
- 技术: python
- 学习: learn
- 选课: course 3) 定义类语法:
class 关键字: 帮你产生类的。 class 类的名字:
- 对象之间相同的特征
- 学校
school = 'oldboy' - 对象之间相同的技能
- python
def python():
pass
- learn
def learn():
pass
- course
def course():
pass

class 类名:
  特征
  技能

定义类名的规范:
  - 驼峰命名法

# 定义老男孩学生类
class OldboyStudent: # 类名指向的是类的内存地址
# 学生相同的特征
# 在类中的特征 也称之为 “属性” attribute
school = 'oldboy' # 学生相同的技能
# 注意: 在类内部定义函数,会默认有一个参数self
def learn(self): # self此时当做一个形参
print('learning....') print(OldboyStudent) # <class '__main__.OldboyStudent'> # 查看类的名称空间 类.__dict__ 对象.__dict__
print(OldboyStudent.__dict__)
print(OldboyStudent.__dict__['school'])
print(OldboyStudent.__dict__['learn'])
OldboyStudent.__dict__['learn'](123) # 类提供一种特殊获取名字的方式 “类名.名字” 的方式
# 查
print(OldboyStudent.school)
OldboyStudent.learn('tank') # 改
OldboyStudent.school = 'OldGirl'
print(OldboyStudent.school) # 删
del OldboyStudent.school # 增
OldboyStudent.school = 'Oldboy'
print(OldboyStudent.school)
OldboyStudent.old_student = 'HuChenYang'
print(OldboyStudent.old_student) '''
- 函数的名称空间:
在调用函数时产生,函数调用结束后销毁。 - 类的名称空间:
在定义阶段时产生,会将类中所有的名字,扔进类的名称空间中。
'''

对象

对象的产生:
  - 调用类产生对象

  类名 + () 调用类产生对象

  类的名称空间在定义时产生,对象的名称空间在调用类时产生。

  调用类产生对象的过程称之为类的实例化,对象称之为类的一个实例。

class Student:
# 学校
school = 'oldboy' # 学习技能 ----> method ---》 方法
def learn(self):
print(self) # 注意:看到self就应该知道是对象本身
print('learning...') stu1 = Student()
stu2 = Student()
stu3 = Student()
# print(Student) #
# print(Student.school, 'Student...')
print(Student.learn, 'Student...') #<function Student.learn at 0x00000000025789D8> Student...
Student.learn(123) #
print('=' * 100) print(stu1) # <__main__.Student object at 0x0000017BFF8A5898>
# print(stu1.school, 'stu1...')
print(stu1.learn, 'stu1...') # learning...
# print(stu1)
# 对象调用方法时: 会将对象当做第一个参数传入方法中。
stu1.learn() # print('=' * 100)
print(stu2) # <__main__.Student object at 0x0000017BFF8A5898>
# print(stu2.school, 'stu2...')
print(stu2.learn, 'stu2...')
stu2.learn() print('=' * 100)
print(stu3) # <__main__.Student object at 0x0000017BFF8A5898>
# print(stu3.school, 'stu3...')
print(stu3.learn, 'stu3...')
stu3.learn()

由对象来调用类内部的函数,称之为对象的绑定方法。
  对象的绑定方法特殊之处: 会将对象当做第一个参数传给该方法。

class Student:
# 学校
school = 'oldboy' def __init__(self, name, sex, age): # stu1, 'tank', 'male', 17
print(self.__dict__) # 给对象添加新的属性
self.name = name # stu1.x = 'tank'
self.sex = sex # stu1.y = 'male'
self.age = age # stu1.z = 17 # 查看当前对象的名称空间
print(self.__dict__) # 学习技能 ----> method ---》 方法
def learn(self):
print(self) # 注意看到self就知道是对象本身
print('learning...')
'''结果
{'__module__': '__main__', 'school': 'oldboy', '__init__': <function Student.__init__ at 0x00000000025989D8>, 'learn': <function Student.learn at 0x0000000009BD1730>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}
{}
{'name': 'ldc', 'sex': 'female', 'age': 18}
江鹏 female 84
'''
# **** 想要在调用类时,为对象传入对象独有 特征
# ***** __init__(self, name, sex, age): # name---> tank , sex---> male, age----> 17
# 调用类时: 会将对象当做第一个参数,与括号内所有的参数一并传给__init__()
# stu1 = Student('tank', 'male', 17) # 注意: 凡是在类内部定义的,__开头或者__结尾的方法都有特殊的意义。
# 在类内部定义的方法,在调用类时触发,会自动将对象本身当做第一个参数自动传入, 与括号内所有的参数一并传给__init__()。
# __init__(self):

对象名字的查找顺序: *******
  1.对象.属性,会先找对象自己的。
  2.若对象没有,会去找类的。
  3.若类没有,则会报错。

class People:
country = 'China'
name = 'jason'
def __init__(self,name,age,sex):
self.name = name
self.age=age
self.sex=sex
def fun(self):
print('running...') obj1 = People('tank',17,'male')
print(obj1.name) # tank 找对象自己的name属性
print(obj1.country) # China 对象没有,找类中的属性
# print(obj1.jason) # AttributeError: 'People' object has no attribute 'jason'
print(obj1.__dict__) #{'name': 'tank', 'age': 17, 'sex': 'male'}
# 给对象的名称空间添加 country='中国' 属性
obj1.country = '中国'
print(obj1.__dict__) # {'name': 'tank', 'age': 17, 'sex': 'male', 'country': '中国'}
print(People.__dict__)
# {'__module__': '__main__', 'country': 'China', 'name': 'jason', '__init__': <function People.__init__ at 0x00000000025989D8>, 'fun': <function People.fun at 0x0000000009BD1730>,
# '__dict__': <attribute '__dict__' of 'People' objects>, '__weakref__': <attribute '__weakref__' of 'People' objects>, '__doc__': None}
print(obj1.country) # 中国

在python中一切皆对象。

number = 10   # int(10)  ----> __init__(number, 10)
int(10)
# l1 ---> list对象
l1 = list([1, 2, 3])
dict()
tuple((1, 2, 3))
float
str
set
bool
enumerate
bytes
filter

人狗大作战

# 人类
class People: def __init__(self, name, life, arg):
self.name = name
self.life = life
self.arg = arg # 人调用bite时,传入狗对象
def bite(self, dog_obj):
print(f'人:[{self.name}] 开始 咬 狗:[{dog_obj.name}]!') # 减掉狗对象中的生命值 值为人的攻击力
dog_obj.life -= self.arg
print(f'狗的生命值减掉: [{self.arg}], 还剩狗的血量: [{dog_obj.life}]') if dog_obj.life <= 0:
print(f'狗[{dog_obj.name}]已经挂了')
return True # 狗类
class Dog:
def __init__(self, name, life, dog_type, arg):
self.name = name
self.dog_type = dog_type
self.life = life
self.arg = arg # 狗对象调用bite时,传入人对象
def bite(self, p_obj):
print(f'狗:[{self.name}] 开始 咬人:[{p_obj.name}]!') # 减掉人对象中的生命值 值为狗的攻击力
p_obj.life -= self.arg
print(f'人的生命值减掉: [{self.arg}], 还剩人的血量: [{p_obj.life}]') if p_obj.life <= 0:
print(f'人[{p_obj.name}]已经挂了')
return True p1 = People('高弟', 2000, 500)
d1 = Dog('HCY', 250, '哈士奇', 2500) p2 = People('高弟2', 5000, 50)
import time while True:
# 开始人狗互咬
# if p1.life or d1.life:
res1 = d1.bite(p2) if res1:
break time.sleep(1)
res2 = p1.bite(d1) if res2:
break time.sleep(1)

总结:

面向对象编程:
  核心是 “对象”, 对象指的是 特征与技能 结合体。
  基于该编程思想编写程序,就好比在创造世界,一种上帝式思维方式。

  优点:
    可扩展性强。

  缺点:
    编写复杂难度较面向过程高。

1.类的实例化: 调用类的过程称之为类的实例化,产生的对象也可以称之为类的一个实例

调用类产生对象发生的事情:
  1.会产生一个空对象的名称空间
  2.会自动触发__init__,并且会将对象当做第一个参数传入。
  3.会将调用类括号内的参数一并传给__init__().

2.查看类与对象的名称空间 类.__dict__   对象.__dict__

3.类或对象的属性操作: 查、增、改、删

4.类中数据属性(类中的变量): 类中属性是给对象使用的,对象引用类中的属性,指向的都是类中同一个内存地址。

5.类中的方法(类中的函数): 类中的方法是给对象使用的,
由不同的对象来调用就会将方法绑定给不同的对象, 并且会将对象当做第一个参数传入。

6.对象属性的查找顺序: 先从对象自己名称空间中查找 ---》 类的名称空间中查找

7.对象绑定方法的特殊之处:

  1.会将对象当做第一个参数传入。******
  2.若对象的绑定方法中还有其他参数,会一并传入。

8.一切皆对象: 在python3中,类即类型。

python基础语法14 面向对象的更多相关文章

  1. python基础语法_3面向对象

    http://www.runoob.com/python3/python3-class.html https://www.imooc.com/learn/317 慕课网:987809563@qq.co ...

  2. python基础语法15 面向对象2 继承,多态,继承json模块中JSONEncoder,并派生出新的功能

    继承 1.什么是继承? 继承是一种新建类的方式,新建的类称之为子类或派生类,继承的父类称之为基类或超类. - 在Python中,一个子类可以继承多个父类.(面试可能会问) - 在其它语言中,一个子类只 ...

  3. python基础语法20 面向对象5 exec内置函数的补充,元类,属性查找顺序

    exec内置函数的补充 exec: 是一个python内置函数,可以将字符串的代码添加到名称空间中; - 全局名称空间 - 局部名称空间 exec(字符串形式的代码, 全局名称空间, 局部名称空间) ...

  4. python基础语法19 面向对象总结,pickle保存对象注意事项

    面向对象的三大特性: 继承,封装,多态 多态的三种表现形式:鸭子类型,继承父类,继承抽象类 pickle保存对象注意事项 class Foo: y = 20 def __new__(cls, *arg ...

  5. python基础语法17 面向对象4 多态,抽象类,鸭子类型,绑定方法classmethod与staticmethod,isinstance与issubclass,反射

    多态 1.什么是多态? 多态指的是同一种类型的事物,不同的形态. 2.多态的目的: “多态” 也称之为 “多态性”,目的是为了 在不知道对象具体类型的情况下,统一对象调用方法的规范(比如:名字). 多 ...

  6. python基础语法16 面向对象3 组合,封装,访问限制机制,内置装饰器property

    组合: 夺命三问: 1.什么是组合? 组合指的是一个对象中,包含另一个或多个对象. 2.为什么要用组合? 减少代码的冗余. 3.如何使用组合? 耦合度: 耦: 莲藕 ---> 藕断丝连 - 耦合 ...

  7. Python 基础语法(三)

    Python 基础语法(三) --------------------------------------------接 Python 基础语法(二)------------------------- ...

  8. python基础语法及知识点总结

    本文转载于星过无痕的博客http://www.cnblogs.com/linxiangpeng/p/6403991.html 在此表达对原创作者的感激之情,多谢星过无痕的分享!谢谢! Python学习 ...

  9. Python基础语法题库

    引言: 语法练习包括Python基础语法.数据类型.字符编码和简单文件操作等内容. 正文(参考答案附录在题目下方): 1.Python 里用来告知解释器跳过当前循环中的剩余语句,然后继续进行下一轮循环 ...

随机推荐

  1. 《Linux就该这么学》培训笔记_ch06_存储结构与磁盘划分

    <Linux就该这么学>培训笔记_ch06_存储结构与磁盘划分 文章最后会post上书本的笔记照片. 文章主要内容: Linux系统的文件存储结构(FHS标准) 物理设备命名规则(udev ...

  2. Struts2利用iText导出word文档(包含表格)以提供下载

    J2EE ExcelStrutsXML  在公司实习期间,带我的老师让我实现一功能——在显示课表的页面上上点击“导出文件“时能以word文档形式下载课表.将课表导出到excel里的功能他们已经实现了, ...

  3. Zookeeper的介绍与基本部署

    目录 简介 架构 安装 StandAlone模式 1. 安装 2. 修改配置 3. 启动 4. 验证 5. 基本用法 Distributed模式 1. 配置hosts 2. 配置zoo.cfg 3. ...

  4. JAVA WEB项目目录结构以及web应用部署的根目录,编译路径和项目根目录的区别

    本文链接:https://blog.csdn.net/l00149133/article/details/78984083 web应用部署的根目录,编译路径和项目的根目录有什么区别? 直接上例子: 你 ...

  5. 【简记】修改Docker数据目录位置,包含镜像位置

    为啥要改? Docker安装后默认下载的位置在/var/lib/docker ,如果/var分区没有独立分出来,Linux下默认是与/根分区在一起.一般我们装Linux系统的时候,除了做邮件服务器外, ...

  6. sqlserver分布式事务

    启动服务中的Distributed Transaction Coodinator后 创建链接服务器ender-pc\subx 设定连接服务器RPC OUT 以及RPC属性为True 实验一下代码 创建 ...

  7. java中反射知识点总结

      1 package Demo; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 impo ...

  8. WCF学习笔记(一)---我的第一个WCF程序

    一.创建WCF程序   1.创建一个控制台程序(WCFBlog)   2.添加wcf项目   3.将默认的IService1和Service1改成自己的名字   4.在ICalculateServic ...

  9. 简约而不简单的Django2.2 新手图文教程

     欢迎大家访问我的个人网站<刘江的博客和教程>www.liujiangblog.com  主要分享Python 及Django教程以及相关的博客! 版权所有,转载需注明来源! 2019年7 ...

  10. Java自学-接口与继承 内部类

    Java 内部类 内部类分为四种: 非静态内部类 静态内部类 匿名类 本地类 步骤 1 : 非静态内部类 非静态内部类 BattleScore "战斗成绩" 非静态内部类可以直接在 ...