type
Post
status
Published
date
Sep 30, 2025
slug
python
summary
菜鸟教程
tags
计算机科学
category
学习笔记
icon
password

Before OOP

推导式

  • 列表推导式
expression可以是一个函数,例如name.upper() ,则可以为:
names显然应该是一个列表,name是列表中的一个项
还可以接上条件判断进行筛选,通用为:
例如如果我们仅仅利用条件来筛选:
这意味着获得30以内能够被3整除的整数,这里i本身被当作一个表达式,当然你可以换成函数,这样函数只会对那些符合条件的执行。
  • 字典推导式
有了列表推导式的认识我们很容易理解以下语法:
对于有条件的情况
显然collection 还是需要为一个列表或者元组,这样的表达式会返回字典
  • 集合推导式
如果把键值对换成单个值返回的就是集合:
有条件的情况:
  • 元组推导式
如果把大括号换成小括号得到的就是元组:
有条件的情况:

函数

Mutable and Immutable

python的变量都是指针
而变量本身的指向信息则存放在命名空间,对于不可变类型,更改赋值就是更改指向:
而对于可变对象,更改对象本身指向是一样的:
打印值相同,但是列表中不同的项地址是不一样的:
而且看起来python的变量并不是连续存放的,如果我们插入:
由于python调用函数时传递的是地址,因此对于可变对象和不可变对象就有差别,对于不可变对象
因此传递不可变对象时我们可以相信,原来的对象不会被改变,但是对于可变对象:

Parameter of function

我们主要讨论可变参数
这里*args意味着将传入的参数当作元组,还有一种可以将传入参数当作字典的:

Lambda

我们最后介绍lambda匿名函数,所谓匿名函数就是定义时没有名字的,如下:
可以注意到,冒号前是变量,冒号后是表达式,匿名函数更大的用途是构造带参量的函数:
注意到这种结构很像数学中的泛函

Decorators

装饰器的直接过程是输入一个函数,并返回一个函数:
这样,当你在调用func() ,你实际在调用new_function ,通常我们称这个新的函数为包装函数wrapper ,现在我们来考虑一下参数传递的问题。
正如我们刚才所说的,如果实际调用的是包装函数,参数应该传给了包装函数,因此:
从这个意义上看,装饰函数似乎完成了对原始函数的一个封装。装饰器本身也可以传入参数:
要理解这个传递如何发生,我们得知道装饰器语法糖的展开为say_hello = repeat(3)(say_hello) ,当执行到repeat(3),调用repeat() 并传入参数,此时返回decorator 函数,从而将repeat(3) 替换为了decorator() ,再传入say_hello ,返回wrapper ,再次替换,say_hello = wrapper ,并且利用闭包机制使得传入的参数被wrapper 记住。我们可以验证这件事:
可以看到,完全符合。
这里我们还介绍一下类的装饰器,首先是函数形式的类装饰器:
同样的,当我们看到@log_class 我们应当认识到执行的是MyClass = log_class(MyClass),据定义返回Wrapper 并传入cls = MyClass
但我们不可能再Wrapper 中一对一的写出MyClass的所有方法,我们希望当调用一个MyClass 中有的但是Wrapper 中没有的方法时,Wrapper 能转交给MyClass ,这就是getattr :
当调用another_method() 方法,但Wrapper 内没有这个方法,就会自动调用__getattr__ ,进而调用getattr(obj, name) 方法,该方法用于寻找obj的名称为name 的属性,从而找到MyClass的实例self.wrapped 的属性another_method
 
我们还有类形式的类装饰器:
这意味着@decorator_class 的语法糖展开中original_class = decorator_class(original_class)发生的是装饰类的构造函数的调用,这有很大的变化,original_class 本身是个类,在这之后变为了decorator_class(original_class) 的实例,因此当我们假装按照类的方法再次创建一个实例obj = original_class(args)其实调用的是装饰类对象的成员函数,这个成员函数就是__call__ 内置函数,按道理这个函数必须返回一个对象,因此我们可以通过这个特性来构造单例类:
 
除此之外,python还有一些内置的装饰器:
  • @staticmethod
可以看到,该装饰器用于将一个方法转为静态方法
  • @classmethod
该装饰器将类本身传入方法
  • @property
可以看到该装饰器将函数转为属性,通常我们将其与setter组合在一起:

OOP

Class Definition and Object

其中__init__ 是python中类的构造函数,self 代表类的实例,而self.__class__ 则指向类

Inheritance

当多继承时,方法先在子类中找,找不到就在父类从左往右找,因此重写会自然发生:
但我们可以利用super 访问父类的已被覆盖的方法:
 
相关文章
C++ OOP第一章 热力学基本定律
Loading...