/images/hugo/avatar.png

6.2 if 和条件判断

if 和条件判断

/images/linux_mt/linux_mt.jpg

本节我们来学习 bash shell 编程的第二部分条件判断,包括以下内容:

  1. 条件测试的实现
  2. 测试表达式
  • 数值测试
  • 字符串测试
  • 文件测试
  • 组合测试
  1. 条件判断语句 if 和 case

1. 条件测试的实现

bash 中测试的实现有两种方式,一是执行命令,并利用命令状态返回值来判断;二是所谓的测试表达式。但是所谓的测试表达式本质上仍然是由特定的测试命令执行,并通过命令状态返回值来判断测试是否满足。条件表达式我的理解只不过是为某些通用的测试目的提供便利。

抽象基类

本章首先介绍了非正式接口(称为协议)的高度动态本性,然后讲解了抽象基类的静态接口声明,最后指出了抽象基类的动态特性:虚拟子类,以及使用 __subclasshook__ 方法动态识别子类

6.1 shell 脚本简介

shell 脚本简介

/images/linux_mt/linux_mt.jpg

本章我们将开始学习 bash shell 编程。bash shell 是一门编程语言,内容庞大,按照课程的设计应该循序渐进逐步深入。但是为便于以后复查参考,会将所有 bash shell 相关的知识放在此章节中。本章我们将学习以下内容:

鸭子类型

1. 协议和鸭子类型

协议:

  • 理解:
    • 在面向对象编程中,协议是非正式的接口,即按照所需的行为实现所需的方法
    • 协议是非正式的,没有强制力,因此如果知道类的具体使用场景,通常只需要实现一个协议的部分
    • eg: 为了支持迭代,只需实现 __getitem__ 方法,没必要提供 __len__ 方法

2. 符合Python风格的序列

2.1 对象表示形式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from array import array
import reprlib
import math
import numbers
import functools
import operator
import itertools  # <1>


class Vector:
    typecode = 'd'

    def __init__(self, components):   # self._components 是“受保护的”实例属性
        self._components = array(self.typecode, components) # 分量保存在一个数组中

    def __iter__(self):
        return iter(self._components) # 支持迭代协议

    def __repr__(self):
        components = reprlib.repr(self._components) # reprlib.repr()获取有限长度表示
        components = components[components.find('['): -1]
        return 'Vector({})'.format(components)

    def __str__(self):
        return str(tuple(self))

    def __bytes__(self):
        return (bytes([ord(self.typecode)]) +
                bytes(self._components))

    def __abs__(self):
        return math.sqrt(sum(x * x for x in self))

    def __bool__(self):
        return bool(abs(self))

    @classmethod
    def frombytes(cls, octets):
        typecode = chr(octets[0])
        memv = memoryview(octets[1: ]).cast(typecode)
        return cls(memv)

reprlib

5.4 Linux特殊权限及facl扩展

Linux特殊权限及facl扩展

/images/linux_mt/linux_mt.jpg

Linux 默认的访问控制模型是通过将用户划分为三类,每类用户都可设置读写执行权限实现的。但是某些特殊情况下,此模型可能不太适用,因为其控制的粒度不够。所谓特殊权限及facl 扩展就是用来扩展Linux 的访问控制模型的。本节内容包括:

Python风格对象

内容概要:

  • 如何使用特殊方法和约定的结构,定义行为良好且符合 Python 风格的类
  • 符合 Python 风格的对象应该正好符合所需,而不是堆砌语言特性

1. 对象表示形式

|特殊方法|调用函数|作用| |: —|: —|: —| |__str__|str()|以用户理解的方式返回对象的字符串表示形式| |__repr__|repr()|以开发者理解的方式返回对象的字符串表示形式| |__bytes__|bytes()|获取对象的字节序列表示形式| |__format__|format() str.format()|使用特殊的格式代码显示对象的字符串表示形式| |__int__ |int()|在某些情况下用于强制转换类型| |__float__|float()|在某些情况下用于强制转换类型| |__complex__|complex()|对象的复数形式|