Ethan's Blog


  • Home

  • Archives

  • Tags

  • Search

面向对象编程

Posted on 2022-03-20

面向对象编程

几乎所有现代编程语言都支持面向对象功能,但由于设计理念不同,不同编程语言所支持的面向对象有许多差异。在 Python 里,万物皆对象,最基础的浮点数也是一个对象。

类常用知识

通过类,我们可以把头脑中的抽象概念进行建模,进而实现复杂的功能。封装(Encapsulation)是面向对象编程里的一个重要概念,为了更好地体现类的封装性,许多编程语言支持将属性设置为公开或私有,只是方式略有不同。

当你使用 __{var} 的方式定义一个私有属性时,Python 解释器只是重新给了它一个包含当前类名的别名 _{class}__{var},因此你仍然可以在外部用这个别名来访问和修改它。

设计哲学:期望程序员做正确的事,而不是在语言上增加太多条条框框。

在某些特殊场景下,合理利用 __dict__ 可以帮你完成常规做法难以做到的一些事情:

  • 实例的 __dict__ 里,保存着当前实例的所有数据;
  • 类的 __dict__ 里,保存着类的文档、方法等所有数据;
Read more »

场景:查找第一张专辑

Posted on 2022-03-13

iTunes 是苹果公司提供的内容商店服务,在里面可以购买世界各地的电影、音乐等数字内容。同时,iTunes 还提供了一个公开的可免费调用的内容查询 API。下面这个脚本就通过调用该 API 实现了查找歌手的第一张专辑的功能:

Read more »

场景:实现有状态函数

Posted on 2022-03-12

三种实现有状态函数的方式:

  • 基于全局变量:
    • 学习成本低,最容易理解;
    • 会增加模块级的全局状态,封装性和可维护性最差;
  • 基于函数闭包:
    • 学习成本适中,可读性较好;
    • 适合用来实现变量较少、较简单的有状态函数;
  • 创建类来封装状态:
    • 学习成本较高;
    • 当变量较多、行为较复杂时,类代码比闭包代码更易读,也更容易维护;

Ethan 正在自学 Python,一天,他从网上看到一道和字符串处理有关的练习题:

有一段文字,里面包含各类数字,比如数量、价格等,编写一段代码把文字里的所有数字都用星号替代,实现脱敏效果。

使用 re.sub() 函数:

1
2
def mosaic_string(s):
return re.sub(r'\d+', '*', s)
Read more »

函数与装饰器

Posted on 2022-03-12

函数

Python 是一门支持面向对象的编程语言,但除此之外,Python 对函数的支持也毫不逊色。函数在 Python 中是一等对象,这意味着我们可以把函数自身作为函数参数来使用。

函数参数的常用技巧

参数(Parameter)是函数的重要组成部分,它是函数最主要的输入源,决定了调用方使用函数时的体验。Python 函数的参数默认值只会在函数定义阶段被创建一次,别将可变类型作为参数默认值,使用 None 来替代:

1
2
3
def append_value(value, items=[]):
items.append(value)
return items
1
2
3
4
5
6
def append_value(value, items=None):
# 在函数内部进行判断,保证参数默认每次都使用一个新的空列表
if items is None:
items = []
items.append(value)
return items

定义一个特殊对象(标记变量)作为参数默认值,严格区分调用方是不是真的提供了这个默认参数:

1
2
3
4
5
6
# object 通常不会单独使用,但是拿来做这种标记变量刚刚好
_not_set = object()

def dump_value(value, extra=_not_set):
if extra is _not_set:
# TODO: 调用方没有传递 extra 参数
Read more »

场景:数字统计任务

Posted on 2022-03-06

Ethan 是一位 Python 初学者,在学习了如何用 Python 读取文件后,他想要做一个小练习:统计某个文件中数字字符的数量:

1
2
3
4
5
6
7
8
def count_digits(fname):
count = 0
with open(fname) as file:
for line in file:
for s in line:
if s.isdigit():
count += 1
return count

首先用 with open(file_name) 上下文管理器语法获得一个文件对象,然后用 for 循环迭代它,逐行获取文件里的内容。它有两个好处:

  • with 上下文管理器会自动关闭文件描述符;
  • 在迭代文件对象时,内容是一行一行返回的,不会占用太多内存;
Read more »
1…111213…55
necusjz

necusjz

271 posts
16 tags
© 2016 - 2026 necusjz
Powered by Hexo
Theme - NexT.Mist