作者 | 周萝卜
来源 | 萝卜大杂烩
Python 作为一门
面向对象编程语言,常用的面向对象知识怎么能不清楚呢,今天就来分享一波
文章很长,高低要忍一下,如果忍不了,那就收藏吧,总会用到的
-
在 Python 中创建一个类及其对象
-
在 Python 中创建一个空类
-
在 Python 中使用 Type 创建类
-
在 Python 中创建和调用类的方法
-
使用 __init__() 方法为数据属性赋值
-
在 Python 中更新对象属性
-
在 Python 中删除对象属性和对象
-
在 Python 中检查和比较对象的类型
-
在Python中将对象的所有属性复制到另一个对象
-
在 Python 中迭代对象属性
-
在 Python 中打印对象的所有属性
-
在python中在运行时创建类的数据属性
-
在函数中将对象的实例作为参数传递
-
在 Python 中创建和使用自定义 Self 参数
-
使用self参数来维护对象的状态
-
在 Python 中创建和使用静态类变量
-
在 Python 中的一个函数上使用多个装饰器
-
在 Python 中的方法中同时访问 cls 和 self
-
从装饰器访问实例方法的类
-
使用给定的装饰器获取 Python 类的所有方法
-
装饰一个 class
-
将类字段作为参数传递给类方法上的装饰器
-
在 Python 中创建多个传入参数列表的类变量
-
Python 中的 wraps 装饰器
-
使用可选参数构建装饰器
-
在 Python 中将参数传递给装饰器
-
@property 装饰器
-
类和函数的装饰器
-
Python 中带参数和返回值的装饰器
-
Python 使用参数 wraps 装饰器
-
Python 装饰器获取类名
-
简单装饰器示例
-
在 Python 中使用 print() 打印类的实例
-
在 Python 中的类中将装饰器定义为方法
-
获取在 Python 中修饰的给定类的所有方法
-
带参数和不带参数的 Python 装饰器
-
Python 中带有 self 参数的类方法装饰器
-
在 Python 中的另一个类中使用隐藏的装饰器
-
装饰器内部的 self 对象
-
在 Python 中将多个装饰器应用于单个函数
-
Python 装饰器获取类实例
-
__init__ 和 __call__ 有什么区别
-
在 Python 中使用 __new__ 和 __init__
-
Python 中的迭代重载方法
-
在 Python 中使用迭代器反转字符串
-
Python 中 __reversed__ 魔术方法
-
Python 中的 __getitem__ 和 __setitem__
-
在 Python 中使用 __getattr__ 和 __setattr__ 进行属性赋值
-
什么是 __del__ 方法以及如何调用它
-
创建类的私有成员
-
一个 Python 封装的例子
-
一个 Python 组合的例子
-
一个Python聚合的例子
-
Python 中的单级、多级和多级继承
-
在 Python 中获取一个类的父类
-
Python 中的多态性
-
访问 Child 类中的私有成员
-
Python 中的抽象类
-
创建一个抽象类来覆盖 Python 中的默认构造函数
-
使一个抽象类继承另一个抽象类
-
Python 中的 super 是做什么的
-
super() 如何在多重继承中与 __init__() 方法一起工作
-
将 super 与类方法一起使用
-
mro 是做什么的
-
Python 中的元类是什么
-
元类的具体案例
-
在 Python 中使用元类的单例类
-
@staticmethod 和 @classmethod 有什么区别
-
Python 中的装饰器是什么
-
制作函数装饰器链
1在 Python 中创建一个类及其对象
class Employee:
salary =
10000
name =
"John Doe"
emp1 = Employee()
print(emp1.salary)
print(emp1.name)
Output:
10000
John Doe
2在 Python 中创建一个空类
class Employee:
pass
e1 = Employee()
print(e1)
e1.name =
"John Doe"
print(e1.name)
Output:
<__main__.Employee object at 0x0000000002DA51D0>
John Doe
3在 Python 中使用 Type 创建类
e1 = type(
'Employee', (), {})()
print(e1)
e1.name =
"John Doe"
print(e1.name)
Output:
<__main__.Employee object at 0x0000000002DCC780>
John Doe
4在 Python 中创建和调用类的方法
class Employee:
salary =
10000
name =
"John Doe"
def tax(self):
print(self.salary *
0.10)
emp1 = Employee()
print(emp1.salary)
print(emp1.name)
emp1.tax()
Output:
10000
John Doe
1000.0
5使用 init() 方法为数据属性赋值
class Employee:
def __init__(self, salary, name):
self.salary = salary
self.name = name
emp1 = Employee(
10000,
"John Doe")
print(emp1.salary)
print(emp1.name)
Output:
10000
John Doe
6在 Python 中更新对象属性
class Employee:
def __init__(self, salary, name):
self.salary = salary
self.name = name
emp1 = Employee(
10000,
"John Doe")
print(emp1.salary)
emp1.salary =
20000
print(emp1.salary)
Output:
10000
20000
7在 Python 中删除对象属性和对象
class Employee:
def __init__(self, salary, name):
self.salary = salary
self.name = name
emp1 = Employee(
10000,
"John Doe")
del emp1.salary
# Delete object property
del emp1
# Delete object
Output:
哈哈
8在 Python 中检查和比较对象的类型
class Test(object):
pass
print(type(Test))
obj1 = Test()
print(type(obj1))
obj2 = Test()
print(type(obj1)
is type(obj2))
Output:
< class 'type' >
< class '__main__.Test' >
True
9在Python中将对象的所有属性复制到另一个对象
class MyClass(object):
def __init__(self):
super(MyClass, self).__init__()
self.foo =
1
self.bar =
2
obj1 = MyClass()
obj2 = MyClass()
obj1.foo =
25
obj2.__dict__.update(obj1.__dict__)
print(obj1.foo)
print(obj2.foo)
Output:
25
25
10在 Python 中迭代对象属性
class A():
m =
1
n =
2
def __int__(self, x=1, y=2, z=3):
self.x = x
self._y = y
self.__z__ = z
def xyz(self):
print(x, y, z)
obj = A()
print(dir(obj))
print([a
for a
in dir(obj)
if not a.startswith(
'__')])
Output:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__int__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'm', 'n', 'xyz']
['m', 'n', 'xyz']
11在 Python 中打印对象的所有属性
class Animal(object):
def __init__(self):
self.eyes =
2
self.name =
'Dog'
self.color=
'Spotted'
self.legs=
4
self.age =
10
self.kids =
0
animal = Animal()
animal.tail =
1
temp = vars(animal)
for item
in temp:
print(item,
':', temp[item])
Output:
kids : 0
eyes : 2
name : Dog
color : Spotted
tail : 1
legs : 4
age : 10
12在python中在运行时创建类的数据属性
class Employee:
pass
emp1 = Employee()
setattr(emp1,
'Salary',
12000)
emp2 = Employee()
setattr(emp2,
'Age',
25)
print(emp1.Salary)
print(emp2.Age)
Output:
12000
25
13在函数中将对象的实例作为参数传递
class Vehicle:
def __init__(self):
self.trucks = []
def add_truck(self, truck):
self.trucks.append(truck)
class Truck:
def __init__(self, color):
self.color = color
def __repr__(self):
return "{}".format(self.color)
def main():
v = Vehicle()
for t
in 'Red Blue Black'.split():
t = Truck(t)
v.add_truck(t)
print(v.trucks)
if __name__ ==
"__main__":
main()
Output:
[Red, Blue, Black]
14在 Python 中创建和使用自定义 Self 参数
class Employee:
def __init__(person, salary, name):
person.salary = salary
person.name = name
def print_details(emp):
print(str(emp.salary)
' : ' emp.name)
emp1 = Employee(
10000,
'John Doe')
emp1.print_details()
Output:
10000 : John Doe
15使用self参数来维护对象的状态
class State(object):
def __init__(self):
self.field =
5.0
def add(self, x):
self.field = x
def mul(self, x):
self.field *= x
def div(self, x):
self.field /= x
def sub(self, x):
self.field -= x
s = State()
print(s.field)
s.add(
2)
# Self is implicitly passed.
print(s.field)
s.mul(
2)
# Self is implicitly passed.
print(s.field)
s.div(
2)
# Self is implicitly passed.
print(s.field)
s.sub(
2)
# Self is implicitly passed.
print(s.field)
Output:
5.0
7.0
14.0
7.0
5.0
16在 Python 中创建和使用静态类变量
class Employee:
age =
25
print(Employee.age)
e = Employee()
print(e.age)
e.age =
30
print(Employee.age)
# 25
print(e.age)
# 30
Output:
25
25
25
30
17在 Python 中的一个函数上使用多个装饰器
def my_decorator(func):
def wrapper():
print(
"Step - 1")
func()
print(
"Step - 3")
return wrapper
def repeat(func):
def wrapper():
func()
func()
func()
return wrapper
@my_decorator
@repeat
def start_steps():
print(
"Step - 2")
start_steps()
Output:
Step - 1
Step - 2
Step - 2
Step - 2
Step - 3
18在 Python 中的方法中同时访问 cls 和 self
class MyClass:
__var2 =
'var2'
var3 =
'var3'
def __init__(self):
self.__var1 =
'var1'
def normal_method(self):
print(self.__var1)
@classmethod
def class_method(cls):
print(cls.__var2)
def my_method(self):
print(self.__var1)
print(self.__var2)
print(self.__class__.__var2)
if __name__ ==
'__main__':
print(MyClass.__dict__[
'var3'])
clzz = MyClass()
clzz.my_method()
Output:
var3
var1
var2
var2
19从装饰器访问实例方法的类
class Decorator(object):
def __init__(self, decoratee_enclosing_class):
self.decoratee_enclosing_class = decoratee_enclosing_class
def __call__(self, original_func):
def new_function(*args, **kwargs):
print(
'decorating function in ', self.decoratee_enclosing_class)
original_func(*args, **kwargs)
return new_function
class Bar(object):
@Decorator('Bar')
def foo(self):
print(
'in foo')
class Baz(object):
@Decorator('Baz')
def foo(self):
print(
'in foo')
print(
'before instantiating Bar()')
b = Bar()
print(
'calling b.foo()')
b.foo()
Output:
before instantiating Bar()
calling b.foo()
decorating function in Bar
in foo
20使用给定的装饰器获取 Python 类的所有方法
import inspect
def deco(func):
return func
def deco2():
def wrapper(func):
pass
return wrapper
class Test(object):
@deco
def method(self):
pass
@deco2()
def method2(self):
pass
def methodsWithDecorator(cls, decoratorName):
sourcelines = inspect.getsourcelines(cls)[
0]
for i, line
in enumerate(sourcelines):
line = line.strip()
if line.split(
'(')[
0].strip() ==
'@' decoratorName:
# leaving a bit out
nextLine = sourcelines[i
1]
name = nextLine.split(
'def')[
1].split(
'(')[
0].strip()
yield(name)
print(list(methodsWithDecorator(Test,
'deco')))
print(list(methodsWithDecorator(Test,
'deco2')))
Output:
['method']
['method2']
21装饰一个 class
from functools
import wraps
def dec(msg='default'):
def decorator(klass):
old_foo = klass.foo
@wraps(klass.foo)
def decorated_foo(self, *args, **kwargs):
print(
'@decorator pre %s' % msg)
old_foo(self, *args, **kwargs)
print(
'@decorator post %s' % msg)
klass.foo = decorated_foo
return klass
return decorator
@dec('foo decorator')
class Foo(object):
def foo(self, *args, **kwargs):
print(
'foo.foo()')
@dec('subfoo decorator')
class SubFoo(Foo):
def foo(self, *args, **kwargs):
print(
'subfoo.foo() pre')
super(SubFoo, self).foo(*args, **kwargs)
print(
'subfoo.foo() post')
@dec('subsubfoo decorator')
class SubSubFoo(SubFoo):
def foo(self, *args, **kwargs):
print(
'subsubfoo.foo() pre')
super(SubSubFoo, self).foo(*args, **kwargs)
print(
'subsubfoo.foo() post')
SubSubFoo().foo()
Output:
@decorator pre subsubfoo decorator
subsubfoo.foo() pre
@decorator pre subfoo decorator
subfoo.foo() pre
@decorator pre foo decorator
foo.foo()
@decorator post foo decorator
subfoo.foo() post
@decorator post subfoo decorator
subsubfoo.foo() post
@decorator post subsubfoo decorator
22将类字段作为参数传递给类方法上的装饰器
import functools
# imagine this is at some different place and cannot be changed
def check_authorization(some_attr, url):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(
f"Welcome Message: '{url}'...")
return func(*args, **kwargs)
return wrapper
return decorator
# another dummy function to make the example work
def do_work():
print(
"work is done...")
def custom_check_authorization(some_attr):
def decorator(func):
# assuming this will be used only on this particular class
@functools.wraps(func)
def wrapper(self, *args, **kwargs):
# get url
url = self.url
# decorate function with original decorator, pass url
return check_authorization(some_attr, url)(func)(self, *args, **kwargs)
return wrapper
return decorator
class Client(object):
def __init__(self, url):
self.url = url
@custom_check_authorization("some_attr")
def get(self):
do_work()
# create object
client = Client(
'Hello World')
# call decorated function
client.get()
Output:
Welcome Message: 'Hello World'...
work is done...
23在 Python 中创建多个传入参数列表的类变量
class Employee(object):
def __init__(self, **kwargs):
for key
in kwargs:
setattr(self, key, kwargs[key])
emp = Employee(age=
25, name=
"John Doe")
print(emp.age)
print(emp.name)
Output:
25
John Doe
24Python 中的 wraps 装饰器
from functools
import wraps
def decorator_func_with_args(arg1, arg2):
def decorator(f):
@wraps(f)
def wrapper(*args, **kwargs):
print(
"Before orginal function with decorator args:", arg1, arg2)
result = f(*args, **kwargs)
print(
"Ran after the orginal function")
return result
return wrapper
return decorator
@decorator_func_with_args("test1", "test2")
def hello(name):
"""A function which prints a greeting to the name provided.
"""
print(
'Hello ', name)
return 25
print(
"Starting script..")
x = hello(
'John')
print(
"The value of x is:", x)
print(
"The wrapped functions docstring is:", hello.__doc__)
print(
"The wrapped functions name is:", hello.__name__)
Output:
Starting script..
Before orginal function with decorator args: test1 test2
Hello John
Ran after the orginal function
The value of x is: 25
The wrapped functions docstring is: A function which prints a greeting to the name provided.
The wrapped functions name is: hello
25使用可选参数构建装饰器
def d(arg):
if callable(arg):
# Assumes optional argument isn't.
def newfn():
print(
'my default message')
return arg()
return newfn
else:
def d2(fn):
def newfn():
print(arg)
return fn()
return newfn
return d2
@d('This is working')
def hello():
print(
'hello world !')
@d # No explicit arguments will result in default message.
def hello2():
print(
'hello2 world !')
@d('Applying it twice')
@d('Would also work')
def hello3():
print(
'hello3 world !')
hello()
hello2()
hello3()
Output:
This is working
hello world !
my default message
hello2 world !
Applying it twice
Would also work
hello3 world !
26在 Python 中将参数传递给装饰器
def decorator_maker_with_arguments(decorator_arg1, decorator_arg2, decorator_arg3):
def decorator(func):
def wrapper(function_arg1, function_arg2, function_arg3):
print(
"The wrapper can access all the variables\n"
"\t- from the decorator maker: {0} {1} {2}\n"
"\t- from the function call: {3} {4} {5}\n"
"and pass them to the decorated function"
.format(decorator_arg1, decorator_arg2, decorator_arg3,
function_arg1, function_arg2, function_arg3))
return func(function_arg1, function_arg2, function_arg3)
return wrapper
return decorator
@decorator_maker_with_arguments("canada", "us", "brazil")
def decorated_function_with_arguments(function_arg1, function_arg2, function_arg3):
print(
"This is the decorated function and it only knows about its arguments: {0}"
" {1}" " {2}".format(function_arg1, function_arg2, function_arg3))
decorated_function_with_arguments(
"france",
"germany",
"uk")
Output:
The wrapper can access all the variables
- from the decorator maker: canada us brazil
- from the function call: france germany uk
and pass them to the decorated function
This is the decorated function and it only knows about its arguments: france germany uk
27@property 装饰器
class Currency:
def __init__(self, dollars, cents):
self.total_cents = dollars *
100 cents
@property
def dollars(self):
return self.total_cents //
100
@dollars.setter
def dollars(self, new_dollars):
self.total_cents =
100 * new_dollars self.cents
@property
def cents(self):
return self.total_cents %
100
@cents.setter
def cents(self, new_cents):
self.total_cents =
100 * self.dollars new_cents
currency = Currency(
10,
20)
print(currency.dollars, currency.cents, currency.total_cents)
currency.dollars =
5
print(currency.dollars, currency.cents, currency.total_cents)
currency.cents =
15
print(currency.dollars, currency.cents, currency.total_cents)
Output:
10 20 1020
15 20 1520
15 35 1535
28类和函数的装饰器
from functools
import wraps
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
print(
'sth to log: %s : %s' % (func.__name__, args))
return func(*args, **kwargs)
return wrapper
class Class_test(object):
@decorator
def sum_func(self, a, b):
print(
'class sum: %s' % (a b))
return a b
print(Class_test.sum_func(
1,
5,
16))
Output:
sth to log: sum_func : (1, 5, 16)
class sum: 21
21
29Python 中带参数和返回值的装饰器
def calculation(func):
def wrapper(*args, **kwargs):
print(
"Inside the calculation function")
num_sum = func(*args, **kwargs)
print(
"Before return from calculation function")
return num_sum
return wrapper
@calculation
def addition(a, b):
print(
"Inside the addition function")
return a b
print(
"Sum =", addition(
5,
10))
Output:
Inside the calculation function
Inside the addition function
Before return from calculation function
Sum = 15
30Python 使用参数 wraps 装饰器
from functools
import wraps
def decorator_func_with_args(arg1, arg2):
def decorator(f):
@wraps(f)
def wrapper(*args, **kwargs):
print(
"Before orginal function with decorator args:", arg1, arg2)
result = f(*args, **kwargs)
print(
"Ran after the orginal function")
return result
return wrapper
return decorator
@decorator_func_with_args("test1", "test2")
def hello(name):
"""A function which prints a greeting to the name provided.
"""
print(
'Hello ', name)
return 25
print(
"Starting script..")
x = hello(
'John')
print(
"The value of x is:", x)
print(
"The wrapped functions docstring is:", hello.__doc__)
print(
"The wrapped functions name is:", hello.__name__)
Output:
Starting script..
Before orginal function with decorator args: test1 test2
Hello John
Ran after the orginal function
The value of x is: 25
The wrapped functions docstring is: A function which prints a greeting to the name provided.
The wrapped functions name is: hello
31Python 装饰器获取类名
def print_name(*args):
def _print_name(fn):
def wrapper(*args, **kwargs):
print(
'{}.{}'.format(fn.__module__, fn.__qualname__))
return fn(*args, **kwargs)
return wrapper
return _print_name
class A():
@print_name()
def a():
print(
'Hi from A.a')
@print_name()
def b():
print(
'Hi from b')
A.a()
b()
Output:
__main__.A.a
Hi from A.a
__main__.b
Hi from b
32简单装饰器示例
def my_decorator(func):
def wrapper():
print(
"Step - 1")
func()
print(
"Step - 3")
return wrapper
@my_decorator
def start_steps():
print(
"Step - 2")
start_steps()
Output:
Step - 1
Step - 2
Step - 3
33在 Python 中使用 print() 打印类的实例
class Element:
def __init__(self, name, city, population):
self.name = name
self.city = city
self.population = population
def __str__(self):
return str(self.__class__)
'\n' '\n'.join((
'{} = {}'.format(item, self.__dict__[item])
for item
in self.__dict__))
elem = Element(
'canada',
'tokyo',
321345)
print(elem)
Output:
name = canada
city = tokyo
population = 321345
34在 Python 中的类中将装饰器定义为方法
class myclass:
def __init__(self):
self.cnt =
0
def counter(self, function):
"""
this method counts the number of runtime of a function
"""
def wrapper(**args):
function(self, **args)
self.cnt =
1
print(
'Counter inside wrapper: ', self.cnt)
return wrapper
global counter_object
counter_object = myclass()
@counter_object.counter
def somefunc(self):
print(
"Somefunc called")
somefunc()
print(counter_object.cnt)
somefunc()
print(counter_object.cnt)
somefunc()
print(counter_object.cnt)
Output:
Somefunc called
Counter inside wrapper: 1
1
Somefunc called
Counter inside wrapper: 2
2
Somefunc called
Counter inside wrapper: 3
3
35获取在 Python 中修饰的给定类的所有方法
class awesome(object):
def __init__(self, method):
self._method = method
def __call__(self, obj, *args, **kwargs):
return self._method(obj, *args, **kwargs)
@classmethod
def methods(cls, subject):
def g():
for name
in dir(subject):
method = getattr(subject, name)
if isinstance(method, awesome):
yield name, method
return {name: method
for name, method
in g()}
class Robot(object):
@awesome
def think(self):
return 0
@awesome
def walk(self):
return 0
def irritate(self, other):
return 0
print(awesome.methods(Robot))
Output:
{'think': <__main__.awesome object at 0x00000213C052AAC0>, 'walk': <__main__.awesome object at 0x00000213C0E33FA0>}
36带参数和不带参数的 Python 装饰器
def someDecorator(arg=None):
def decorator(func):
def wrapper(*a, **ka):
if not callable(arg):
print(arg)
return func(*a, **ka)
else:
return 'xxxxx'
return wrapper
if callable(arg):
return decorator(arg)
# return 'wrapper'
else:
return decorator
# ... or 'decorator'
@someDecorator(arg=1)
def my_func():
print(
'my_func')
@someDecorator
def my_func1():
print(
'my_func1')
if __name__ ==
"__main__":
my_func()
my_func1()
Output:
1
my_func
37Python 中带有 self 参数的类方法装饰器
def check_authorization(f):
def wrapper(*args):
print(
'Inside wrapper function argement passed :', args[
0].url)
return f(*args)
return wrapper
class Client(object):
def __init__(self, url):
self.url = url
@check_authorization
def get(self):
print(
'Inside get function argement passed :', self.url)
Client(
'Canada').get()
Output:
Inside wrapper function argement passed : Canada
Inside get function argement passed : Canada
38在 Python 中的另一个类中使用隐藏的装饰器
class TestA(object):
def _decorator(foo):
def magic(self):
print(
"Start magic")
foo(self)
print(
"End magic")
return magic
@_decorator
def bar(self):
print(
"Normal call")
_decorator = staticmethod(_decorator)
class TestB(TestA):
@TestA._decorator
def bar(self):
print(
"Override bar in")
super(TestB, self).bar()
print(
"Override bar out")
print(
"Normal:")
test = TestA()
test.bar()
print(
'-' *
10)
print(
"Inherited:")
b = TestB()
b.bar()
Output:
Normal:
Start magic
Normal call
End magic
----------
Inherited:
Start magic
Override bar in
Start magic
Normal call
End magic
Override bar out
End magic
39装饰器内部的 self 对象
import random
def only_registered_users(func):
def wrapper(handler):
print(
'Checking if user is logged in')
if random.randint(
0,
1):
print(
'User is logged in. Calling the original function.')
func(handler)
else:
print(
'User is NOT logged in. Redirecting...')
return wrapper
class MyHandler(object):
@only_registered_users
def get(self):
print(
'Get function called')
m = MyHandler()
m.get()
Output:
Checking if user is logged in
User is logged in. Calling the original function.
Get function called
40在 Python 中将多个装饰器应用于单个函数
def multiplication(func):
def wrapper(*args, **kwargs):
num_sum = func(*args, **kwargs)
print(
"Inside the multiplication function", num_sum)
return num_sum * num_sum
return wrapper
def addition(func):
def wrapper(*args, **kwargs):
num_sum = func(*args, **kwargs)
print(
"Inside the addition function", num_sum)
return num_sum num_sum
return wrapper
@addition
@multiplication
def calculation(a):
print(
"Inside the calculation function", a)
return a
print(
"Sum =", calculation(
5))
Output:
Inside the calculation function 5
Inside the multiplication function 5
Inside the addition function 25
Sum = 50
41Python 装饰器获取类实例
class MySerial():
def __init__(self):
pass # I have to have an __init__
def write(self, *args):
print(args[
0])
pass # write to buffer
def read(self):
pass # read to buffer
@staticmethod
def decorator(func):
def func_wrap(cls, *args, **kwargs):
cls.ser.write(func(cls, *args, **kwargs))
return cls.ser.read()
return func_wrap
class App():
def __init__(self):
self.ser = MySerial()
@MySerial.decorator
def myfunc(self):
self =
100
return [
'canada',
'australia']
App().myfunc()
Output:
['canada', 'australia']
42init 和 call 有什么区别
class Counter:
def __init__(self):
self._weights = []
for i
in range(
0,
2):
self._weights.append(
1)
print(str(self._weights[
-2])
" No. from __init__")
def __call__(self, t):
self._weights = [self._weights[
-1], self._weights[
-1]
self._weights[
-1]]
print(str(self._weights[
-1])
" No. from __call__")
num_count = Counter()
for i
in range(
0,
4):
num_count(i)
Output:
1 No. from __init__
2 No. from __call__
4 No. from __call__
8 No. from __call__
16 No. from __call__
43在 Python 中使用 new 和 init
class Shape:
def __new__(cls, sides, *args, **kwargs):
if sides ==
3:
return Triangle(*args, **kwargs)
else:
return Square(*args, **kwargs)
class Triangle:
def __init__(self, base, height):
self.base = base
self.height = height
def area(self):
return (self.base * self.height) /
2
class Square:
def __init__(self, length):
self.length = length
def area(self):
return self.length*self.length
a = Shape(sides=
3, base=
2, height=
12)
b = Shape(sides=
4, length=
2)
print(str(a.__class__))
print(a.area())
print(str(b.__class__))
print(b.area())
Output:
class '__main__.Triangle'
12.0
class '__main__.Square'
4
44Python 中的迭代重载方法
class Counter:
def __init__(self, low, high):
self.current = low
self.high = high
def __iter__(self):
return self
def __next__(self):
if self.current > self.high:
raise StopIteration
else:
self.current =
1
return self.current -
1
for num
in Counter(
5,
15):
print(num)
Output:
5
6
..
..
15
45在 Python 中使用迭代器反转字符串
class Reverse:
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def __next__(self):
if self.index ==
0:
raise StopIteration
self.index = self.index -
1
return self.data[self.index]
test = Reverse(
'Python')
for char
in test:
print(char)
Output:
n
o
h
t
y
P
46Python 中 reversed 魔术方法
class Count:
def __init__(self, start, end):
self.start = start
self.end = end
self.current =
None
def __iter__(self):
self.current = self.start
while self.current < self.end:
yield self.current
self.current =
1
def __next__(self):
if self.current
is None:
self.current = self.start
if self.current > self.end:
raise StopIteration
else:
self.current =
1
return self.current
-1
def __reversed__(self):
self.current = self.end
while self.current >= self.start:
yield self.current
self.current -=
1
obj1 = Count(
0,
5)
for i
in obj1:
print(i)
obj2 = reversed(obj1)
for i
in obj2:
print(i)
Output:
0
1
2
....
2
1
0
47Python 中的 getitem 和 setitem
class Counter(object):
def __init__(self, floors):
self._floors = [
None]*floors
def __setitem__(self, floor_number, data):
self._floors[floor_number] = data
def __getitem__(self, floor_number):
return self._floors[floor_number]
index = Counter(
4)
index[
0] =
'ABCD'
index[
1] =
'EFGH'
index[
2] =
'IJKL'
index[
3] =
'MNOP'
print(index[
2])
Output:
IJKL
48在 Python 中使用 getattr 和 setattr 进行属性赋值
class Employee(object):
def __init__(self, data):
super().__setattr__(
'data', dict())
self.data = data
def __getattr__(self, name):
if name
in self.data:
return self.data[name]
else:
return 0
def __setattr__(self, key, value):
if key
in self.data:
self.data[key] = value
else:
super().__setattr__(key, value)
emp = Employee({
'age':
23,
'name':
'John'})
print(emp.age)
print(emp.name)
print(emp.data)
print(emp.salary)
emp.salary =
50000
print(emp.salary)
Output:
23
John
{'age': 23, 'name': 'John'}
0
50000
49什么是 del 方法以及如何调用它
class Employee():
def __init__(self, name='John Doe'):
print(
'Hello ' name)
self.name = name
def developer(self):
print(self.name)
def __del__(self):
print(
'Good Bye ' self.name)
emp = Employee(
'Mark')
print(emp)
emp =
'Rocky'
print(emp)
Output:
Hello Mark
<__main__.Employee object at 0x00000000012498D0>
Good Bye Mark
Rocky
50创建类的私有成员
class Test(object):
__private_var =
100
public_var =
200
def __private_func(self):
print(
'Private Function')
def public_func(self):
print(
'Public Function')
print(self.public_var)
def call_private(self):
self.__private_func()
print(self.__private_var)
t = Test()
print(t.call_private())
print(t.public_func())
Output:
Private Function
100
None
Public Function
200
None
51一个 Python 封装的例子
class Encapsulation:
__name =
None
def __init__(self, name):
self.__name = name
def get_name(self):
return self.__name
pobj = Encapsulation(
'Rocky')
print(pobj.get_name())
Output:
Rocky
52一个 Python 组合的例子
class Salary:
def __init__(self, pay):
self.pay = pay
def get_total(self):
return (self.pay*
12)
class Employee:
def __init__(self, pay, bonus):
self.pay = pay
self.bonus = bonus
self.obj_salary = Salary(self.pay)
def annual_salary(self):
return "Total: " str(self.obj_salary.get_total() self.bonus)
obj_emp = Employee(
600,
500)
print(obj_emp.annual_salary())
Output:
Total: 7700
53一个Python聚合的例子
class Salary:
def __init__(self, pay):
self.pay = pay
def get_total(self):
return (self.pay*
12)
class Employee:
def __init__(self, pay, bonus):
self.pay = pay
self.bonus = bonus
def annual_salary(self):
return "Total: " str(self.pay.get_total() self.bonus)
obj_sal = Salary(
600)
obj_emp = Employee(obj_sal,
500)
print(obj_emp.annual_salary())
Output:
Total: 7700
54Python 中的单级、多级和多级继承
# Single inheritence
class Apple:
manufacturer =
'Apple Inc'
contact_website =
'www.apple.com/contact'
name =
'Apple'
def contact_details(self):
print(
'Contact us at ', self.contact_website)
class MacBook(Apple):
def __init__(self):
self.year_of_manufacture =
2018
def manufacture_details(self):
print(
'This MacBook was manufactured in {0}, by {1}.'
.format(self.year_of_manufacture, self.manufacturer))
macbook = MacBook()
macbook.manufacture_details()
# Multiple inheritence
class OperatingSystem:
multitasking =
True
name =
'Mac OS'
class MacTower(OperatingSystem, Apple):
def __init__(self):
if self.multitasking
is True:
print(
'Multitasking system')
# if there are two superclasses with the sae attribute name
# the attribute of the first inherited superclass will be called
# the order of inhertence matters
print(
'Name: {}'.format(self.name))
mactower = MacTower()
# Multilevel inheritence
class MusicalInstrument:
num_of_major_keys =
12
class StringInstrument(MusicalInstrument):
type_of_wood =
'Tonewood'
class Guitar(StringInstrument):
def __init__(self):
self.num_of_strings =
6
print(
'The guitar consists of {0} strings,'
'it is made of {1} and can play {2} keys.'
.format(self.num_of_strings,
self.type_of_wood, self.num_of_major_keys))
guitar = Guitar()
Output:
This MacBook was manufactured in 2018, by Apple Inc.
Multitasking system
Name: Mac OS
The guitar consists of 6 strings, it is made of Tonewood and can play 12 keys.
55在 Python 中获取一个类的父类
class A(object):
pass
class B(object):
pass
class C(A, B):
pass
print(C.__bases__)
Output:
(< class '__main__.A' >, < class '__main__.B' >)
56Python 中的多态性
# Creating a shape Class
class Shape:
width =
0
height =
0
# Creating area method
def area(self):
print(
"Parent class Area ... ")
# Creating a Rectangle Class
class Rectangle(Shape):
def __init__(self, w, h):
self.width = w
self.height = h
# Overridding area method
def area(self):
print(
"Area of the Rectangle is : ", self.width*self.height)
# Creating a Triangle Class
class Triangle(Shape):
def __init__(self, w, h):
self.width = w
self.height = h
# Overridding area method
def area(self):
print(
"Area of the Triangle is : ", (self.width*self.height)/
2)
rectangle = Rectangle(
10,
20)
triangle = Triangle(
2,
10)
rectangle.area()
triangle.area()
Output:
Area of the Rectangle is : 200
Area of the Triangle is : 10.0
57访问 Child 类中的私有成员
class Human():
# Private var
__privateVar =
"this is __private variable"
# Constructor method
def __init__(self):
self.className =
"Human class constructor"
self.__privateVar =
"this is redefined __private variable"
# Public method
def showName(self, name):
self.name = name
return self.__privateVar
" " name
# Private method
def __privateMethod(self):
return "Private method"
# Public method that returns a private variable
def showPrivate(self):
return self.__privateMethod()
def showProtecded(self):
return self._protectedMethod()
class Male(Human):
def showClassName(self):
return "Male"
def showPrivate(self):
return self.__privateMethod()
def showProtected(self):
return self._protectedMethod()
class Female(Human):
def showClassName(self):
return "Female"
def showPrivate(self):
return self.__privateMethod()
human = Human()
print(human.className)
print(human.showName(
"Vasya"))
print(human.showPrivate())
male = Male()
print(male.className)
print(male.showClassName())
female = Female()
print(female.className)
print(female.showClassName())
Output:
Human class constructor
this is redefined __private variable Vasya
Private method
Human class constructor
Male
Human class constructor
Female
58Python 中的抽象类
from abc
import ABC, abstractmethod
class AbstractClass(ABC):
def __init__(self, value):
self.value = value
super().__init__()
@abstractmethod
def eat(self):
pass
class Parents(AbstractClass):
def eat(self):
return "Eat solid food " str(self.value)
" times each day."
class Babies(AbstractClass):
def eat(self):
return "Milk only " str(self.value)
" times or more each day."
food =
3
adult = Parents(food)
print(
'Adult')
print(adult.eat())
infant = Babies(food)
print(
'Infants')
print(infant.eat())
Output:
Adult
Eat solid food 3 times each day.
Infants
Milk only 3 times or more each day.
59创建一个抽象类来覆盖 Python 中的默认构造函数
from abc
import ABCMeta, abstractmethod
class AbstractClass(object, metaclass=ABCMeta):
@abstractmethod
def __init__(self, n):
self.n = n
class Employee(AbstractClass):
def __init__(self, salary, name):
self.salary = salary
self.name = name
emp1 = Employee(
10000,
"John Doe")
print(emp1.salary)
print(emp1.name)
Output:
10000
John Doe
60使一个抽象类继承另一个抽象类
from abc
import ABC, abstractmethod
class A(ABC):
def __init__(self, username):
self.username = username
super().__init__()
@abstractmethod
def name(self):
pass
class B(A):
@abstractmethod
def age(self):
pass
class C(B):
def name(self):
print(self.username)
def age(self):
return
c = C(
'Test1234')
c.name()
Output:
Test1234
61Python 中的 super 是做什么的
class A(object):
def __init__(self, profession):
print(profession)
class B(A):
def __init__(self):
print(
'John Doe')
super().__init__(
'Developer')
b = B()
Output:
John Doe
Developer
62super() 如何在多重继承中与 init() 方法一起工作
class F:
def __init__(self):
print(
'F%s' % super().__init__)
super().__init__()
class G:
def __init__(self):
print(
'G%s' % super().__init__)
super().__init__()
class H:
def __init__(self):
print(
'H%s' % super().__init__)
super().__init__()
class E(G, H):
def __init__(self):
print(
'E%s' % super().__init__)
super().__init__()
class D(E, F):
def __init__(self):
print(
'D%s' % super().__init__)
super().__init__()
class C(E, G):
def __init__(self):
print(
'C%s' % super().__init__)
super().__init__()
class B(C, H):
def __init__(self):
print(
'B%s' % super().__init__)
super().__init__()
class A(D, B, E):
def __init__(self):
print(
'A%s' % super().__init__)
super().__init__()
a = A()
print(a)
Output:
A bound method D.__init__ of __main__.A object at 0x000000000369CFD0
D bound method B.__init__ of __main__.A object at 0x000000000369CFD0
B bound method C.__init__ of __main__.A object at 0x000000000369CFD0
C bound method E.__init__ of __main__.A object at 0x000000000369CFD0
E bound method G.__init__ of __main__.A object at 0x000000000369CFD0
G bound method H.__init__ of __main__.A object at 0x000000000369CFD0
H bound method F.__init__ of __main__.A object at 0x000000000369CFD0
F method-wrapper '__init__' of A object at 0x000000000369CFD0
__main__.A object at 0x000000000369CFD0
63将 super 与类方法一起使用
class A(object):
@classmethod
def name(self, employee):
print(
'Employee Name: ', employee)
class B(A):
@classmethod
def name(self, employee):
super(B, self).name(employee)
B.name(
'John Doe')
Output:
Employee Name: John Doe
64mro 是做什么的
class A(object):
def dothis(self):
print(
'From A class')
class B1(A):
def dothis(self):
print(
'From B1 class')
pass
class B2(object):
def dothis(self):
print(
'From B2 class')
pass
class B3(A):
def dothis(self):
print(
'From B3 class')
# Diamond inheritance
class D1(B1, B3):
pass
class D2(B1, B2):
pass
d1_instance = D1()
d1_instance.dothis()
print(D1.__mro__)
d2_instance = D2()
d2_instance.dothis()
print(D2.__mro__)
Output:
From B1 class
(class '__main__.D1', class '__main__.B1', )
From B1 class
(class '__main__.D2', class '__main__.B1', , class '__main__.B2', class 'object')
65Python 中的元类是什么
def _addMethod(fldName, clsName, verb, methodMaker, dict):
compiledName = _getCompiledName(fldName, clsName)
methodName = _getMethodName(fldName, verb)
dict[methodName] = methodMaker(compiledName)
def _getCompiledName(fldName, clsName):
if fldName[:
2] ==
"__" and fldName[
-2:] !=
"__":
return "_%s%s" % (clsName, fldName)
else:
return fldName
def _getMethodName(fldName, verb):
s = fldName.lstrip(
"_")
return verb s.capitalize()
def _makeGetter(compiledName):
return lambda self: self.__dict__[compiledName]
def _makeSetter(compiledName):
return lambda self, value: setattr(self, compiledName, value)
class Accessors(type):
def __new__(cls, clsName, bases, dict):
for fldName
in dict.get(
"_READ", []) dict.get(
"_READ_WRITE", []):
_addMethod(fldName, clsName,
"get", _makeGetter, dict)
for fldName
in dict.get(
"_WRITE", []) dict.get(
"_READ_WRITE", []):
_addMethod(fldName, clsName,
"set", _makeSetter, dict)
return type.__new__(cls, clsName, bases, dict)
class Employee(object, metaclass=Accessors):
_READ_WRITE = [
'name',
'salary',
'title',
'bonus']
def __init__(self, name, salary, title, bonus=0):
self.name = name
self.salary = salary
self.title = title
self.bonus = bonus
b = Employee(
'John Doe',
25000,
'Developer',
5000)
print(
'Name:', b.getName())
print(
'Salary:', b.getSalary())
print(
'Title:', b.getTitle())
print(
'Bonus:', b.getBonus())
Output:
Name: John Doe
Salary: 25000
Title: Developer
Bonus: 5000
66元类的具体案例
class UpperAttrNameMetaClass(type):
def __new__(cls, clsname, bases, attrdict, *args, **kwargs):
print(
'1. Create a new type, from '
' UpperAttrNameMetaClass.__new__')
new_attrs = dict()
for attr, value
in attrdict.items():
if not callable(value)
and not str(attr).startswith(
'__'):
new_attrs[attr.upper()] = value
else:
new_attrs[attr] = value
cls_obj = super().__new__(cls, clsname, bases, new_attrs,
*args, **kwargs)
return cls_obj
def __init__(self, clsname, bases, attrdict):
self.test =
'test'
super().__init__(clsname, bases, attrdict)
print(
'2. Initialize new type, increase test attribute,'
'from UpperAttrNameMetaClass.__init__')
def __call__(self, *args, **kwargs):
print(
'3. Instantiate the new class,'
' from UpperAttrNameMetaClass.__call__')
new_obj = self.__new__(self, *args, **kwargs)
new_obj.__init__(*args, **kwargs)
return new_obj
class ObjectNoInitMetaClass(type):
def __call__(cls, *args, **kwargs):
if len(args):
raise TypeError(
'Must use keyword argument '
' for key function')
new_obj = cls.__new__(cls)
for k, v
in kwargs.items():
setattr(new_obj, k.upper(), v)
return new_obj
class Pig(object, metaclass=UpperAttrNameMetaClass):
size =
'Big'
def __new__(cls, *args, **kwargs):
print(
'4. Call __new__ in the __call__ of the metaclass,'
' from Pig.__new__')
obj = object.__new__(cls)
return obj
def __init__(self):
print(
'5. After the new object is instantiated in '
'the __call__ of the metaclass,the object is promoted,'
' from Pig.__init__')
self.name =
'Mark'
def talk(self):
print(self.name)
Pig().talk()
print(Pig.__dict__)
print(Pig.SIZE)
class AnyOne(metaclass=ObjectNoInitMetaClass):
pass
foo = AnyOne(name=
'John', age=
28)
print(foo.NAME, foo.AGE)
print(foo.__dict__)
Output:
1. Create a new type, from UpperAttrNameMetaClass.__new__
2. Initialize new type, increase test attribute,from UpperAttrNameMetaClass.__init__
3. Instantiate the new class, from UpperAttrNameMetaClass.__call__
4. Call __new__ in the __call__ of the metaclass, from Pig.__new__
5. After the new object is instantiated in the __call__ of the metaclass,the object is promoted, from Pig.__init__
Mark
{'__doc__': None, 'test': 'test', '__weakref__': , 'SIZE': 'Big', '__init__': , '__dict__': , '__module__': '__main__', '__new__': , 'talk': }
Big
John 28
{'AGE': 28, 'NAME': 'John'}
67在 Python 中使用元类的单例类
class SingleInstanceMetaClass(type):
def __init__(self, name, bases, dic):
self.__single_instance =
None
super().__init__(name, bases, dic)
def __call__(cls, *args, **kwargs):
if cls.__single_instance:
return cls.__single_instance
single_obj = cls.__new__(cls)
single_obj.__init__(*args, **kwargs)
cls.__single_instance = single_obj
return single_obj
class Setting(metaclass=SingleInstanceMetaClass):
def __init__(self):
self.db =
'MySQL'
self.port =
3306
bar1 = Setting()
bar2 = Setting()
print(bar1
is bar2)
print(bar1.db, bar1.port)
bar1.db =
'ORACLE'
print(bar2.db, bar2.port)
Output:
True
MySQL 3306
ORACLE 3306
68@staticmethod 和 @classmethod 有什么区别
class Employee:
@classmethod
def classmthd(*args):
return args
@staticmethod
def staticmthd(*args):
return args
print(Employee.classmthd())
print(Employee.classmthd(
'test'))
print(Employee.staticmthd())
print(Employee.staticmthd(
'test'))
Output:
(class '__main__.Employee',)
(class '__main__.Employee', 'test')
()
('test',)
69Python 中的装饰器是什么
def message(param1, param2):
def wrapper(wrapped):
class WrappedClass(wrapped):
def __init__(self):
self.param1 = param1
self.param2 = param2
super(WrappedClass, self).__init__()
def get_message(self):
return "message %s %s" % (self.param1, self.param2)
return WrappedClass
return wrapper
@message("param1", "param2")
class Pizza(object):
def __init__(self):
pass
pizza_with_message = Pizza()
print(pizza_with_message.get_message())
Output:
message param1 param2
70制作函数装饰器链
def benchmark(func):
"""
A decorator that prints the time a function takes
to execute.
"""
import time
def wrapper(*args, **kwargs):
t = time.clock()
res = func(*args, **kwargs)
print(
"{0} {1}".format(func.__name__, time.clock()-t))
return res
return wrapper
def logging(func):
"""
A decorator that logs the activity of the script.
(it actually just prints it, but it could be logging!)
"""
def wrapper(*args, **kwargs):
res = func(*args, **kwargs)
print(
"{0} {1} {2}".format(func.__name__, args, kwargs))
return res
return wrapper
def counter(func):
"""
A decorator that counts and prints the number of times a
function has been executed
"""
def wrapper(*args, **kwargs):
wrapper.count = wrapper.count
1
res = func(*args, **kwargs)
print(
"{0} has been used: {1}x".format(func.__name__, wrapper.count))
return res
wrapper.count =
0
return wrapper
@counter
@benchmark
@logging
def letter_range(start, stop, step=1):
start = ord(start.lower())
stop = ord(stop.lower())
for str_lst
in range(start, stop, step):
yield chr(str_lst)
print(list(letter_range(
"a",
"f")))
print(
'\n')
print(list(letter_range(
"m",
"z",
2)))
Output:
letter_range ('a', 'f') {}
wrapper 0.0009437184107374183
wrapper has been used: 1x
['a', 'b', 'c', 'd', 'e']
letter_range ('m', 'z', 2) {}
wrapper 3.131164480070134e-05
wrapper has been used: 2x
['m', 'o', 'q', 's', 'u', 'w', 'y']
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。