Python advanced

decorator

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

def mydecorator(function):

def wrapper(*args, **kwargs):
function(*args, **kwargs)
print(" I am decorating your funciton!")


return wrapper

@mydecorator
def hello_world(name):
print(f"Hello {name}")

hello_world("mike")

Example 1 保存调试信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def logged(function):
def wrapper(*args, **kwargs):
value = function(*args, **kwargs)
with open("logfile.txt", "a+") as f:
fname = function.__name__
print(f"{fname} returned value {value}")
f.write(f"{fname} returned value {value}\n")
return value

return wrapper

@logged
def add(x, y):
return x + y

print(add(10, 20))

Example 2 计时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import time

def timed(function):
def wrapper(*args, **kwargs):
before = time.time()
value = function(*args, **kwargs)
after = time.time()
fname = function.__name__
print(f"{fname} took {after - before} seconds to execute!")
return value

return wrapper

@timed
def myfunction(x):
result = 1
for i in range(1, x):
result *= i
return result

myfunction(1000)

generator

1
2
3
4
5
6
7
8
9
10
def infinite_sequence():
result = 1
while True:
yield result
result *= 5

values = infinite_sequence()

for i in range(5):
print(next(values))

argument parsing

1
2
3
4
5
6
7
8
import sys
# Usage: python test.py filename

filename = sys.argv[1]
message = sys.argv[2]

with open(filename, "w+") as f:
f.write(message)

或者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import sys
import getopt

filename = "text.txt"
message = "Hello"

opts, args = getopt.getopt(sys.argv[1:],"f:m:", ["filename", "message"])

for opt, arg in opts:
if opt == '-f':
filename = arg
if opt == '-m':
message = arg

with open(filename, "w+") as f:
f.write(message)

encapsulation

没有直接范围隐藏数据成员

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
class Person:

def __init__(self, name, age, gender):

self.__name = name
self.__age = age
self.__gender = gender

@property
def Name(self):
return self.__name

@Name.setter # python 没有重载,只有这种
def Name(self, value):
if value == 'Bob':# 统一处理访问
self.__name = 'Defult name'
else:
self.__name = value

@staticmethod
def mymethod():
print("Hello World from static method!")

Person.mymethod()

p1 = Person('mike', 27, 'male')
print(p1.Name)

p1.Name = 'john'
print(p1.Name)

Type hinting

使用mypy做类型检查

1
mypy .\test.py

使用显式类型标注

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def myfunction(myparameter:int) -> int:
return myparameter + 10

print(myfunction(8))

def dosth(param: list[int]) -> list[int]:
for i in range(len(param)):
param[i] += 1

return param

l = [1,2,3,4,5]

print(dosth(l))

Magic methods

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Vector:

def __init__(self, x, y):
self.x = x
self.y = y

def __add__(self, other):
return(Vector(self.x + other.x, self.y + other.y))

def __repr__(self) -> str:
return f"X: {self.x}, Y: {self.y}"

def __call__(self):
print("Hello! I was called!")

v1 = Vector(10,20)
v2 = Vector(50,40)
v3 = v1 + v2
print(v3)
v3()