今日内容

  • 面向对象基本用法
  • 好处和应用场景
  • 面向对象的三大特性

内容详细

1.面向对象基本格式

# ###### 定义类 ######
class 类名:
def 方法名(self,name):
print(name)
return 123
def 方法名(self,name):
print(name)
return 123
def 方法名(self,name):
print(name)
return 123
# ###### 调用类中的方法 ######
# 1.创建该类的对象
obj = 类名()
# 2.通过对象调用方法
result = obj.方法名('alex')
print(result)

应用场景:遇到很多函数,需要给函数进行归类和划分。 【封装】

练习题:

#!/usr/bin/env python
# -*- coding:utf-8 -*- class Db:
def db_read(self):
pass def db_write(self):
pass def db_delete(self):
pass def db_update(self):
pass class File:
def file_read(self):
pass def file_write(self):
pass def file_delete(self):
pass def file_update(self):
pass class Redis:
def redis_read(self):
pass def redis_write(self):
pass def redis_delete(self):
pass def redis_update(self):
pass

2.对象的作用

存储一些值,以后方便自己使用。

class File:
def read(self):
with open(self.xxxxx, mode='r', encoding='utf-8') as f:
data = f.read()
return data def write(self, content):
with open(self.xxxxx, mode='a', encoding='utf-8') as f:
f.write(content) # # 实例化了一个File类的对象
obj1 = File()
# # 在对象中写了一个xxxxx = 'test.log'
obj1.xxxxx = "test.log"
# # 通过对象调用类中的read方法,read方法中的self就是obj。
# # obj1.read()
obj1.write('alex') # 实例化了一个File类的对象
obj2 = File()
# 在对象中写了一个xxxxx = 'test.log'
obj2.xxxxx = "info.txt"
# 通过对象调用类中的read方法,read方法中的self就是obj。
# obj2.read()
obj2.write('alex')
class Person:
def show(self):
temp = "我是%s,年龄:%s,性别:%s " %(self.name,self.age,self.gender,)
print(temp) p1 = Person()
p1.name = '李邵奇'
p1.age = 19
p1.gender = '男'
p1.show() p2 = Person()
p2.name = '利奇航'
p2.age = 19
p2.gender = '男'
p2.show()
class Person:
def __init__(self,n,a,g): # 初始化方法(构造方法),给对象的内部做初始化。
self.name = n
self.age = a
self.gender = g def show(self):
temp = "我是%s,年龄:%s,性别:%s " % (self.name, self.age, self.gender,)
print(temp) # 类() 实例化对象,自动执行此类中的 __init__方法。
p1 = Person('李兆琪',19,'男')
p1.show() p2 = Person('利奇航',19,'男')
p2.show()

总结:将数据封装到对象,方便使用。

总结

"""
如果写代码时,函数比较多比较乱。
1. 可以将函数归类并放到同一个类中。
2. 函数如果有一个反复使用的公共值,则可以放到对象中。
""" class File:
def __init__(self,path):
self.file_path = path def read(self):
print(self.file_path) def write(self,content):
print(self.file_path) def delete(self):
print(self.file_path) def update(self):
print(self.file_path) p1 = File('log.txt')
p1.read() p2 = File('xxxxxx.txt')
p2.read()
# 1. 循环让用户输入:用户名/密码/邮箱。 输入完成后再进行数据打印。
# ########## 以前的写法
USER_LIST = []
while True:
user = input('请输入用户名:')
pwd = input('请输入密码:')
email = input('请输入邮箱:')
temp = {'username':user,'password':pwd,'email':email}
USER_LIST.append(temp)
for item in USER_LIST:
temp = "我的名字:%s,密码:%s,邮箱%s" %(item['username'],item['password'],item['email'],)
print(temp) # ########## 面向对象写法 class Person:
def __init__(self,user,pwd,email):
self.username = user
self.password = pwd
self.email = email USER_LIST = [对象(用户/密码/邮箱),对象(用户/密码/邮箱),对象(用户/密码/邮箱)]
while True:
user = input('请输入用户名:')
pwd = input('请输入密码:')
email = input('请输入邮箱:')
p = Person(user,pwd,email)
USER_LIST.append(p) for item in USER_LIST:
temp = "我的名字:%s,密码:%s,邮箱%s" %(item.username,item.password,item.email,)
print(temp) # ########## 面向对象写法 class Person:
def __init__(self,user,pwd,email):
self.username = user
self.password = pwd
self.email = email def info(self):
return "我的名字:%s,密码:%s,邮箱%s" %(item.username,item.password,item.email,) USER_LIST = [对象(用户/密码/邮箱),对象(用户/密码/邮箱),对象(用户/密码/邮箱)]
while True:
user = input('请输入用户名:')
pwd = input('请输入密码:')
email = input('请输入邮箱:')
p = Person(user,pwd,email)
USER_LIST.append(p) for item in USER_LIST:
msg = item.info()
print(msg)

3.游戏开发

class Police:
def __init__(self,name)
self.name = name
self.hp = 10000 def tax(self):
msg = "%s收了个税。" %(self.name,)
print(msg) def fight(self):
msg = "%s去战了个斗。" %(self.name,) lsq = Police('李邵奇')
zzh = Police('渣渣会')
tyg = Police('堂有光') class Bandit:
def __init__(self,nickname)
self.nickname = nickname
self.hp = 1000 def murder(self,name):
msg = "%s去谋杀了%s" %(self.nickname, name,) lcj = Bandit('二蛋')
lp = Bandit('二狗')
zsd = Bandit('狗蛋') # 1. 二狗去谋杀渣渣会,二狗生命值-100; 渣渣会生命值减5000
lp.murder(zzh.name)
lp.hp = lp.hp - 100
zzh.hp = zzh.hp - 5000
# ...
class Police:
def __init__(self,name)
self.name = name
self.hp = 10000 def dao(self,other):
msg = "%s个了%s一刀。" %(self.name,other.nickname)
self.hp = self.hp - 10
other.hp = other.hp - 50
print(msg) def qiang(self):
msg = "%s去战了个斗。" %(self.name,) def quan(self,other):
msg = "%s个了%s一全。" %(self.name,other.nickname)
self.hp = self.hp - 2
other.hp = other.hp - 10
print(msg) class Bandit:
def __init__(self,nickname)
self.nickname = nickname
self.hp = 1000 def qiang(self,other):
msg = "%s个了%s一全。" %(self.nickname,other.name)
self.hp -= 20
other.hp -= 500 lcj = Bandit('二蛋') lsq = Police('李邵奇')
lsq.dao(lcj)
lsq.quan(lcj)
lcj.qiang(lsq)

4.继承

# 父类(基类)
class Base:
def f1(self):
pass
# 子类(派生类)
class Foo(Base):
def f2(self):
pass # 创建了一个字类的对象
obj = Foo()
# 执行对象.方法时,优先在自己的类中找,如果没有就是父类中找。
obj.f2()
obj.f1() # 创建了一个父类的对象
obj = Base()
obj.f1()

问题:什么时候才能用到继承?多个类中如果有公共的方法,可以放到基类中避免重复编写。

class Base:
def f1(self):
pass class Foo(Base):
def f2(self):
pass class Bar(Base):
def f3(self):
pass obj1 = Foo() obj2 = Bar()

继承关系中的查找方法的顺序:

# 示例一
class Base:
def f1(self):
print('base.f1') class Foo(Base):
def f2(self):
print('foo.f2') obj = Foo()
obj.f1()
obj.f2() # 示例二
class Base:
def f1(self):
print('base.f1') class Foo(Base):
def f2(self):
self.f1()
print('foo.f2') obj = Foo()
obj.f2() # 示例三
class Base:
def f1(self):
print('base.f1') class Foo(Base):
def f2(self):
self.f1()
print('foo.f2')
def f1(self):
print('foo.f1') obj = Foo()
obj.f2() # 示例四
class Base:
def f1(self):
self.f2()
print('base.f1')
def f2(self):
print('base.f2')
class Foo(Base):
def f2(self):
print('foo.f2') obj = Foo()
obj.f1() # 示例五
class TCPServer:
pass
class ThreadingMixIn:
pass
class ThreadingTCPServer(ThreadingMixIn, TCPServer):
pass # 示例六
class BaseServer:
def serve_forever(self, poll_interval=0.5):
self._handle_request_noblock()
def _handle_request_noblock(self):
self.process_request(request, client_address) def process_request(self, request, client_address):
pass class TCPServer(BaseServer):
pass class ThreadingMixIn:
def process_request(self, request, client_address):
pass class ThreadingTCPServer(ThreadingMixIn, TCPServer):
pass obj = ThreadingTCPServer()
obj.serve_forever()

注意事项:

  • self 到底是谁?
  • self 是哪个类创建的,就从此类开始找,自己没有就找父类。

5.多态(多种形态/多种类型)鸭子模型

# Python
def func(arg):
v = arg[-1] # arg.append(9)
print(v) # java
def func(str arg):
v = arg[-1]
print(v)

面试题:什么是鸭子模型。

对于一个函数而言,Python对于参数的类型不会限制,那么传入参数时就可以是各种类型,在函数中如果有例如:arg.send方法,那么就是对于传入类型的一个限制(类型必须有send方法)。
这就是鸭子模型,类似于上述的函数我们认为只要能呱呱叫的就是鸭子(只有有send方法,就是我们要想的类型)

总结

  1. 面向对象的三大特性:封装/继承/多态

    • 封装

      class File:
      def read(self):
      pass
      def write(self):
      pass
      class Person:
      def __init__(sef,name,age):
      self.name = name
      self.age = age
      p = Person('alex',19)
    • 继承

      class Base:
      pass
      class Foo(Base):
      pass
      • 多继承
      • self到底是谁?
      • self是由于那个类创建,则找方法时候就从他开始找。
    • 多态

      def func(arg): # 多种类型,很多事物
      arg.send() # 必须具有send方法,呱呱叫
  2. 格式和关键词

    class 类:
    def __init__(self,x):
    self.x = x def 方法(self,name):
    print(self.x, name) # 实例化一个类的对象
    v1 = 类(666)
    v2.方法('alex')

    三个词:

    • 对象
    • 方法
  3. 什么时候用面向对象?

    • 函数(业务功能)比较多,可以使用面向对象来进行归类。
    • 想要做数据封装(创建字典存储数据时,面向对象)。
    • 游戏示例:创建一些角色并且根据角色需要再创建人物。

python笔记19的更多相关文章

  1. python笔记-19 javascript补充、web框架、django基础

    一.JavaScript的补充 1 正则表达式 1.1 test的使用 test 测试是否符合条件 返回true or false 1.2 exec的使用 exec 从字符串中截取匹配的字符 1.3 ...

  2. Python笔记 #19# 实现bpnn

    代码编辑&解释工具:Jupyter Notebook 快速入门 形象说明BP神经网络的用法(图片来自推特): Bpnn类最主要的三个方法: initialize方法,用于设定神经网络的层数.各 ...

  3. python笔记 - day6

    python笔记 - day6 参考: http://www.cnblogs.com/wupeiqi/articles/5501365.html 大纲: 利用递归,实现阶乘: Python反射 pyt ...

  4. python笔记 - day5

    python笔记 - day5 参考: http://www.cnblogs.com/wupeiqi/articles/5484747.html http://www.cnblogs.com/alex ...

  5. s21day21 python笔记

    s21day21 python笔记 一.内容回顾及补充 内置函数补充 type():查看数据类型 class Foo: pass obj = Foo() if type(obj) == Foo: pr ...

  6. s21day19 python笔记

    s21day19 python笔记 一.面向对象的基本知识 1.1 基本格式 # 定义类 class 类名: def 方法名(self,name): print(name) return 123 de ...

  7. s21day05 python笔记

    s21day05 python笔记 一.昨日内容回顾及补充 回顾 补充 列表独有功能 extend:循环添加到一个列表中 1.users = ['张三',66],people = ['王五',99] ...

  8. python笔记-1(import导入、time/datetime/random/os/sys模块)

    python笔记-6(import导入.time/datetime/random/os/sys模块)   一.了解模块导入的基本知识 此部分此处不展开细说import导入,仅写几个点目前的认知即可.其 ...

  9. python笔记(2)--字符串

    一.字符串 字符串是不可变序列,具有序列的公共操作方法,具体操作见python笔记(1)--序列(列表 元组 range) 1.创建字符串 单引号:'Hello , I am Logan ! ' 双引 ...

随机推荐

  1. 解决阿里云ECS下kubeadm部署k8s无法指定公网IP

    背景 一般情况下,"kubeadm"部署集群时指定"--apiserver-advertise-address=<public_ip>"参数,即可在 ...

  2. Tomcat黑窗口中对于中文乱码问题的解决

    存在的问题: 如标题,下图所示,启动tomcat时黑窗口中中文乱码,影响查看程序打印信息 解决方案: tomcat安装/解压目录中,conf 文件夹下 logging.properties 文件中,代 ...

  3. 你对Java泛型的理解够深入吗?

    泛型 泛型提供了一种将集合类型传达给编译器的方法,一旦编译器知道了集合元素的类型,编译器就可以对其类型进行检查,做类型约束. 在没有泛型之前: /** * 迭代 Collection ,注意 Coll ...

  4. MySQL 持久化保障机制-redo 日志

    我们在 聊一聊 MySQL 中的事务及其实现原理 中提到了 redo 日志,redo 日志是用来保证 MySQL 持久化功能的,需要注意的是 redo 日志是 InnoDB 引擎特有的功能. 为什么 ...

  5. Scala实践1

    一.Scala安装和配置 1.1安装 Scala需要Java运行时库,安装Scala需要首先安装jdk. 然后在Scala官网下载 程序安装包 根据不同的操作系统选择不同的安装包,下载完成后,将安装包 ...

  6. Java 集合的工具类Collections的常用方法

    Collections类 java.utils.Collections是集合工具类,用来对集合进行操作. Collections类的常用方法 这里介绍四个常用方法: addAll(Collection ...

  7. feign架构 原理解析

    什么是feign? 来自官网的解释:Feign makes writing java http clients easier 在使用feign之前,我们怎么发送请求? 拿okhttp举例: publi ...

  8. 【UEFI&BIOS】---BIOS开机串口报"ERROR: C2:V1050007 IO 93B80003-9FB3-11D4-9A3A-0090273FC14D 6413FA18"的分析

    intel的X86 CPU对运行错误的处理已经做的非常完善了,一般即使是开机卡死,跑飞等各种问题也会丢给你相关的提示信息,那么掌握这种错误的分析手段就显得至关重要.在实际开发的过程中,我遇到了一个错误 ...

  9. DateTime.Now

    // 2008年4月24日 System.DateTime.Now.ToString( " D " );// 2008-4-24 System.DateTime.Now.ToStr ...

  10. pycharm 连接mysql失败

    1.下载与之对应的驱动 2.更改数据库的时区(问题大多数出现在这里) .查看时区 show variables like '%time_zone%'; .设置时区 set global time_zo ...