再再肝3天,整理了70个Python面向对象编程案例,怎能不收藏?(上)

简介: 再再肝3天,整理了70个Python面向对象编程案例,怎能不收藏?(上)

Python 作为一门面向对象编程语言,常用的面向对象知识怎么能不清楚呢,今天就来分享一波

文章很长,高低要忍一下,如果忍不了,那就收藏吧,总会用到的

萝卜哥也贴心的做成了PDF,在文末获取!


  • 在 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>}
相关文章
|
2月前
|
Python
Python面向对象(2)
【10月更文挑战第14天】
Python面向对象(2)
|
2月前
|
设计模式 程序员 C语言
Python面向对象
【10月更文挑战第13天】
Python面向对象
|
2月前
|
Java C# Python
Python学习七:面向对象编程(中)
这篇文章是关于Python面向对象编程的中级教程,涵盖了析构函数、对象的三大特征(封装、继承、多态)、类属性与实例属性、以及类方法与静态方法的对比。
23 2
|
2月前
|
设计模式 安全 JavaScript
Python学习八:面向对象编程(下):异常、私有等
这篇文章详细介绍了Python面向对象编程中的私有属性、私有方法、异常处理及动态添加属性和方法等关键概念。
25 1
|
2月前
|
数据采集 前端开发 NoSQL
Python编程异步爬虫实战案例
Python编程异步爬虫实战案例
|
2月前
|
数据采集 自然语言处理 API
Python反爬案例——验证码的识别
Python反爬案例——验证码的识别
|
2月前
|
iOS开发 MacOS Python
Python编程小案例—利用flask查询本机IP归属并输出网页图片
Python编程小案例—利用flask查询本机IP归属并输出网页图片
|
2月前
|
Java Python
Python学习六:面向对象编程(上)
这篇文章是关于Python面向对象编程的基础知识,包括类和对象的概念、实例方法、属性、self关键字以及魔法方法等。
16 0
|
2月前
|
存储 算法 API
Python学习五:函数、参数(必选、可选、可变)、变量、lambda表达式、内置函数总结、案例
这篇文章是关于Python函数、参数、变量、lambda表达式、内置函数的详细总结,包含了基础知识点和相关作业练习。
29 0
|
2月前
|
人工智能 API iOS开发
ChatGPT编程Python小案例(拿来就用)—解压zip压缩文
ChatGPT编程Python小案例(拿来就用)—解压zip压缩文