今日内容

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

内容详细

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. c++数字和字符之间的转化

    关于C++中数与字符之间的转化 在c++中我们经常遇到需要把一个数变成字符,或者把字符变为一个数,c++中没有直接的转化函数,故我们需要自己去写函数去转化,这里我将介绍两种比较简单的方法: 法一: s ...

  2. hdfs/hbase 程序利用Kerberos认证超过ticket_lifetime期限后异常

    问题描述 业务需要一个长期运行的程序,将上传的文件存放至HDFS,程序启动后,刚开始一切正常,执行一段时间(一般是一天,有的现场是三天),就会出现认证错误,用的JDK是1.8,hadoop-clien ...

  3. cogs 173. 词链 字典树模板

    173. 词链 ★★☆   输入文件:link.in   输出文件:link.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述]给定一个仅包含小写字母的英文单词表,其中每个 ...

  4. 使用远程接口库进一步扩展Robot Framework的测试能力

    引言: Robot Framework的四层结构已经极大的提高了它的扩展性.我们可以使用它丰富的扩展库来完成大部分测试工作.可是碰到下面两种情况,仅靠四层结构就不好使了: 1.有些复杂的测试可能跨越多 ...

  5. FreeRTOS独立看门狗检测任务执行状态

    为了保证FreeRTOS的所有用户任务都在正常的运行,我们通过独立看门狗的形式来检测,一旦发现有某个任务长时间没有执行,看门狗就会将系统复位. 运行条件: 创建5个用户任务Task1,Task2,Ta ...

  6. nginx介绍与安装

    1.nginx作用可以配置数十个场景 ​ ​ 2.环境安装 环境确认 ​ 安装环境 yum -y install gcc gcc-c++ autoconf pcre-devel make automa ...

  7. css 透明度

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...

  8. JS ES6补充

    补充点:1.let const 2.字符串模板 3.箭头函数  4.对象的单体模式 5.面向对象 一.定义变量 A.var 特点: 1.定义全局变量 2.可以重复定义 3.变量名提升 <!DOC ...

  9. Numpy科学计算从放弃到入门

    目录 一.什么是Numpy ndarray对象 相关文档 二.如何创建数组 三.如何访问数组 下标索引 切片索引 布尔型索引 整数索引 方形索引 四.如何做算数运算 五.如何使用统计函数 六.数组转置 ...

  10. NSCTF-Reverse02 超级详细且简单的办法搞定

    没有壳 VC写的 观察界面 一个编辑框 一个按钮 拖进IDA 在导入表里找到GetDlgItemTextA 为什么找这个函数 因为这个函数的作用就是 获取我们输入编辑框的内容 双击进入 ctrl+X ...