零基础小白Python入门必看:面向对象之典型魔术方法

Python类中魔术方法(Magic Methods)完全指南:从入门到精通 本文全面解析Python中的魔术方法(Magic Methods),这些以双下划线开头和结尾的特殊方法(如__init__、__str__)为类提供了强大的内置行为支持。 阅读详情

 

魔术方法

查看类的魔术方法

class A:
    pass
dir(A)  # 可以得到类所有公有成员
复制代码

输出结果如下

['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__']
复制代码

在Python中,所有以__双下划线包起来的方法,都统称为魔术方法。比如最常见的 __init__ 。

这里多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以进裙930900780领取。

创建/销毁

  • __new__: object.__new__(cls) 创建类的方法:构造函数
  • __del__:删除类:析构函数
  • __init__:初始化函数
class A:
    def __new__(cls, *args, **kwargs):
        print('new')
        return object.__new__(cls)

    def __init__(self):
        print('init')
        self.x = 3

    def __del__(self):
        print('del')

A() # 返回一个类<__main__.A at 0x7f4a84767978>
# 输出
new
init

a = A()
del a  # 输出del
复制代码

每当实例空间被收回时(在垃圾收集时),__del__就会自动执行。

运算符重载

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

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

    def __sub__(self, other):
        return Point(self.x - other.x, self.y - other.y)

a = Point(0, 0)
b = Point(3, 5)
c = a + b
c += Point(4, 6)
print(c.x, c.y)  # 7, 11  
p = Point(3, 5) - Point(2, 1)
print(p.x, p.y)  # 1, 4
复制代码

类的对象之间可以进行加减运算,只要类实现了加减运算对应的魔术方法即可。加法的具体实现是__add__,减法的具体实现是__sub__。

  • 具体运算符对应的重载函数可以参考int类中运算符重载的实现:help(int)

不要过度使用运算符重载

Point.__add__ = lambda self, value: self - value
p = Point(3, 5) + Point(4, 6)
print(p.x, p.y)  # 输出-1, -1
复制代码

__add__的具体实现如果写成了减法,这种类型的错误非常不容易发现,因此如果不是在写库给第三方使用的时候,基本用不上运算符重载。

hash

  • 使用内置函数hash对某个对象求hash值时, 会调用对象的__hash__方法,示例代码如下
In [1]: class Point:
   ...:     def __hash__(self):
   ...:         return 1
   ...:     

In [2]: hash(Point())
Out[2]: 1
复制代码
  • __hash__方法必须返回int,否则会抛出TypeError
In [1]: class Point:
   ...:     def __hash__(self):
   ...:         return 'aaa'
   ...:     

In [2]: hash(Point())
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-a919dcea3eae> in <module>()
----> 1 hash(Point())

TypeError: __hash__ method should return an integer
复制代码
  • 可hash对象,就是具有__hash__方法的对象
In [6]: class Point:
   ...:     def __hash__(self):
   ...:         return 1
   ...:         

In [7]: set([Point(), 12]) # 可hash
Out[7]: {<__main__.Point at 0x7f19d4073320>, 12}

In [8]: Point.__hash__ = None

In [9]: set([Point(), 12])  # 不能放在集合里面,因为不能hash
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-10-25999920b521> in <module>()
----> 1 set([Point(), 12])

TypeError: unhashable type: 'Point'

复制代码
  • 一个类如果没有重写__hash__方法的话,这个类的每个对象,通常具有不同的hash
In [1]: class Point:
   ...:     pass
   ...: 

In [2]: p1 = Point()

In [3]: p2 = Point()

In [4]: hash(p1)
Out[4]: 8757059543567

In [5]: hash(p2)
Out[5]: 8757059543756
复制代码
  • 通常 __hash__ 会和 __eq__一起使用, 因为解释器通常同时判断hash是否相等以及实例是否相等
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __hash__(self):
        return hash('{}:{}'.format(self.x, self.y))

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

p1 = Point(3, 5)
p2 = Point(3, 5)
set([p1, p2])  # 返回 {<__main__.Point at 0x7f286092d588>}
hash(p1) == hash(p2)  # 返回True
p1 == p2  # 返回True
复制代码

大小

当对象实现了__len__方法时,可以使用内置方法len求对象的长度, __len__方法必须返回非负整数

lst = [1, 2, 3]
len(lst)  # 返回3
lst.__len__()  # 返回3
复制代码

因此内置函数和__len__方法的效果相同。

class Sized:
    def __len__(self):
        return 10

len(Sized())  # 返回10
复制代码

bool

  • 当对象o实现了__bool__ 方法时, bool(o)返回值为o.__bool__()
class F:
    def __bool__(self):
        return False

bool(F())  # 返回False

class T:
    def __bool__(self):
        return True

bool(T())  # 返回True
复制代码
  • 当对象o没有实现__bool__方法时,如果o实现了__len__方法, bool(o)返回值为 len(o) != 0
class L:
    def __len__(self):
        return 3

bool(L())  # 返回True

class Q:
    def __len__(self):
        return 0

bool(Q())  # 返回False
复制代码
  • 当对象o既没有实现__bool__方法,也没有实现 __len__方法的时候, bool(o)返回值为True
class Boolean:
    pass

bool(Boolean())  # 返回True
复制代码
  • __bool__优先级比__len__更高
class Sized:
    def __init__(self, size):
        self.size = size

    def __len__(self):
        return self.size

    def __bool__(self):
        return self.size == 0

bool(Sized(0))  # 返回True
bool(Sized(10))  # 返回False
复制代码
  • __bool__方法必须返回bool类型
class B:
    def __bool__(self):
        return None  # 返回非bool类型的值时会出错,即使返回int型的也会报错

bool(B())
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-80-4efbb03885fe> in <module>()
----> 1 bool(B())

TypeError: __bool__ should return bool, returned NoneType
复制代码

可视化

  • __str__方法,print函数本质是调用对象的__str__方法,用于给人读
  • __repr__方法,repr函数本质是调用对象的__repr__方法,用于给机器读
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):  # 给人来读
        return 'Point<{}, {}>'.format(self.x, self.y)

    def __repr__(self): # 给机器读的
        return 'Point({}, {})'.format(self.x, self.y)

print(Point(3, 5))  # Point<3, 5>
print(repr(Point(3, 5)))  # Point(3, 5)
复制代码

repr:返回对象的规范化的字符串表示

可调用对象

class Fn:
    def __call__(self):
        print('{} called'.format(self))

f = Fn()
f()

# 输出
<__main__.Fn object at 0x7fd254367470> called
复制代码

一个对象,只要实现了__call__方法, 就可以通过小括号来来调用, 这一类对象,称之为可调用对象

给对象加上函数也就是对__call__方法加上参数:

class Add:
    def __call__(self, x, y):
        return x + y

Add()(3, 5)  # 返回8,等价于 add =Add() add(3, 5)
复制代码

可调用对象的应用实例:实现可过期可换出的cache装饰器

import inspect
import datetime
from functools import wraps

class Cache:
    def __init__(self, size=128, expire=0):
        self.size = size
        self.expire = 0
        self.data = {}

    @staticmethod
    def make_key(fn, args, kwargs):
        ret = []
        names = set()
        params = inspect.signature(fn).parameters
        keys = list(params.keys())
        for i, arg in enumerate(args):
            ret.append((keys[i], arg))
            names.add(keys[i])
        ret.extend(kwargs.items())
        names.update(kwargs.keys())
        for k, v in params.items():
            if k not in names:
                ret.append((k, v.default))
        ret.sort(key=lambda x: x[0])
        return '&'.join(['{}={}'.format(name, arg) for name, arg in ret])

    def __call__(self, fn):
        @wraps(fn)
        def wrap(*args, **kwargs):
            key = self.make_key(fn, args, kwargs)
            now = datetime.datetime.now().timestamp()
            if key in self.data.keys():
                value, timestamp, _ = self.data[key]
                if expire == 0 or now - timestamp < expire:
                    self.data[key] = (value, timestamp, now)
                    return value
                else:
                    self.data.pop(key)
            value = fn(*args, **kwargs)
            if len(self.data) >= self.size: 
                # 过期清理
                if self.expire != 0:
                    expires = set()
                    for k, (_, timestamp, _) in self.data.items():
                        if now - timestamp >= self.expire:
                            expires.add(k)
                    for k in expires:
                        self.data.pop(k)
            if len(self.data) >= self.size:
                # 换出
                k = sorted(self.data.items(), key=lambda x: x[1][2])[0][0]
                self.data.pop(k)
            self.data[key] = (value, now, now)
            return value
        return wrap

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

add(1, 2)  # 返回3
复制代码

用__call__来实现可调用对象,和闭包是殊途同归的,通常是为了封装一些内部状态

上下文管理

支持上下文管理的对象

class Context:
    def __enter__(self):
        print('enter context')

    def __exit__(self, *args, **kwargs):
        print('exit context')
复制代码

当一个对象同时实现了__enter__和__exit__方法,那么这个对象就是支持上下文管理的对象。

支持上下文管理的对象可以使用以下语句块进行处理:

with obj:
    pass
复制代码

比如

with Context():
    print('do somethings')
print('out of context')

# 输出
enter context
do somethings
exit context
out of context
复制代码

所以,with开启一个语句块, 执行这个语句块之前,会执行 __enter__方法, 执行这个语句块之后,会执行__exit__ 方法,也就是说在这个语句块的前后会执行一些操作,因此也叫上下文。

  • 即使with块抛出异常,__enter__和__exit__也会被执行,所以上下文管理是安全的。
with Context():
    raise Exception()

enter context
exit context
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-126-c1afee4bfdab> in <module>()
      1 with Context():
----> 2     raise Exception()

Exception: 
复制代码
  • 即使with块中主动退出解释器, __enter__ 和__exit__也能保证执行
import sys

with Context():
   sys.exit()

enter context
exit context
An exception has occurred, use %tb to see the full traceback.

SystemExit

/home/clg/.pyenv/versions/3.5.2/envs/normal/lib/python3.5/site-packages/IPython/core/interactiveshell.py:2889: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
  warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
复制代码

with块的as字句

  • as子句可以获取__enter__方法的返回值
class Context:
    def __enter__(self):
        print('enter context')
        return self  # __enter__函数的返回值

    def __exit__(self, *args, **kwargs):
        print('exit context')

ctx = Context()
with ctx as c:
    print(id(ctx))
    print(id(c))
    print(c)

# 输出结果
enter context
140541332713712
140541332713712
<__main__.Context object at 0x7fd2543670f0>
exit context
复制代码

__enter__方法

  • __enter__方法的返回值可以被as字句捕获到
  • __enter__ 除self之外,不带任何参数
class Context:
    def __enter__(self, *args, **kwargs):
        print('enter context')
        print(args)
        print(kwargs)


    def __exit__(self, *args, **kwargs):
        print('exit context')

# 输出
enter context
()
{}
exit context
复制代码

args和kwargs都是空的,因此上下文管理的时候__enter__函数除self外,不带任何参数。

__exit__方法

  • __exit__的返回值,没有办法获取到,如果with块中抛出异常 __exit__返回False的时候,会向上抛出异常,返回True, 会屏蔽异常
class Context:
    def __enter__(self):
        print('enter context')

    def __exit__(self, *args, **kwargs):
        print('exit context')
        return 'haha'

with Context() as c:
    print(c)

# 输出
enter context
None
exit context
复制代码
  • __exit__的三个参数 异常类型, 异常, traceback
class Context:
    def __enter__(self):
        print('enter context')

    def __exit__(self, *args, **kwargs):
        print('exit context')
        print(args)
        print(kwargs)

with Context():
    pass

# 输出
enter context
exit context
(None, None, None)
{}
复制代码

args输出三个None,表示三个位置参数,kwargs为空,表示没有关键字参数。

with Context():
    raise Exception()

enter context
exit context
(<class 'Exception'>, Exception(), <traceback object at 0x7f28608fdc88>)
{}
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-145-c1afee4bfdab> in <module>()
      1 with Context():
----> 2     raise Exception()

Exception: 
复制代码
  • 使用变量接受__exit__的三个参数:exc_type,exc_value,traceback
class Context:
    def __enter__(self):
        print('enter context')

    def __exit__(self, exc_type, exc_value, traceback):
        print('exit context')
        print('exception type: {}'.format(exc_type))
        print('exception value: {}'.format(exc_value))
        print('exception traceback: {}'.format(traceback))
        return True

with Context():
    raise TypeError('hahaha')

# 输出
enter context
exit context
exception type: <class 'TypeError'>
exception value: hahaha
exception traceback: <traceback object at 0x7fd257c18608>
复制代码

上下文管理的应用场景

with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。即凡是在代码块前后插入代码的场景统统适用

  1. 资源管理
  2. 权限验证

以下以计时器为例

from functools import wraps
class Timeit:
    def __init__(self, fn=None):
        wraps(fn)(self)

    def __call__(self, *args, **kwargs):
        start = datetime.datetime.now()
        ret = self.__wrapped__(*args, **kwargs)
        cost = datetime.datetime.now() - start
        print(cost)
        return ret

    def __enter__(self):
        self.start = datetime.datetime.now()

    def __exit__(self, *args):
        cost = datetime.datetime.now() - self.start
        print(cost)

with Timeit():
    z = 3 + 8  # 输出0:00:00.000037

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

add(3, 8)  # 输出0:00:00.000044  返回11
复制代码

总共实现了两种计时方式,既可以对语句块计时,也可以对函数计时。

contextmanager的使用

contextlib是个比with优美的东西,也是提供上下文管理机制的模块,它是通过Generator装饰器实现的,不再是采用__enter__和__exit__。contextlib中的contextmanager作为装饰器来提供一种针对函数级别的上下文管理机制。

import contextlib


@contextlib.contextmanager
def context():
    print('enter context') # 初始化部分 相当于 __enter__ 方法
    try:
        yield 'haha' # 相当于__enter__的返回值
    finally:
        print('exit context') # 清理部分, 相当于 __exit__ 方法


with context() as c:
    print(c)
    raise Exception()

# 输出
enter context
haha
exit context
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-189-4c1dae6b647a> in <module>()
      1 with context() as c:
      2     print(c)
----> 3     raise Exception()

Exception: 
复制代码

yield后面必须配合finally使用,否则如果抛出异常,程序不会执行yield后面的部门,也就是不会执行__exit__部分。

反射

python的反射,核心本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,就是一种基于字符串的事件驱动!

关于模块的python反射以及反射机制分析参见:python反射机制深入分析

以下主要分析类对象的反射机制

getattr setattr hasattr

三个函数的原型:

  1. getattr:getattr(object, name[, default]) -> value。getattr(x, 'y')等效于x.y
  2. setattr:setattr(obj, name, value, /)。setattr(x, 'y', v)等效于x.y = v
  3. hasattr:hasattr(obj, name, /)

主要作用是通过对象的成员名称获取对象的成员

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

    def print(self, x, y):
        print(x, y)

p = Point(3, 5)
p.__dict__['x'] # 返回3, 对于属性来说,可以通过 __dict__ 获取
getattr(p, 'print')(3, 5) # 成员方法无法通过__dict__获取,但是可以通过getattr函数获取 # p.print(3, 5)
getattr(p, 'x') # getattrr 也可以获取到属性
setattr(p, 'haha', 'abcd') # p.haha = 'abcd',给对象p增加属性haha
p.haha  # 返回abcd
hasattr(p, 'print')  # 返回True

复制代码

setattr的对象是实例,如果要给实例动态增加方法,需要先把函数转化为方法,转化的方法如下:

import types

def mm(self):
    print(self.x)

setattr(p, 'mm', types.MethodType(mm, p))  # 将mm函数转化为对象p的方法之后,再给p增加
p.mm()  # 输出3
复制代码

使用getattr setattr hasattr 实现一个命令路由器:

class Command:
    def cmd1(self):
        print('cmd1')
    def cmd2(self):
        print('cmd2')
    def run(self):
        while True:
            cmd = input('>>>').strip()
            if cmd == 'quit':
                return
            getattr(self, cmd, lambda :print('not found cmd {}'.format(cmd)))()

command = Command()
command.run()

# 输出 
>>>cmd1
cmd1
>>>cmd2
cmd2
>>>cmd3
not found cmd cmd3
>>>quit
复制代码

__getattr__ __setattr__ __delattr__

  • 当一个类定义了__getattr__方法时,如果访问不存在的成员,会调用__getattr__方法
class A:
    def __init__(self):
        self.x = 3

a = A()
a.x  # 返回3
a.y  # 如果没有实现__getattr__方法,当访问不存在的成员时会报错
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-228-cc7049c6eeec> in <module>()
----> 1 a.y

AttributeError: 'A' object has no attribute 'y'
复制代码

增加__getattr__方法

class A:
    def __init__(self):
        self.x = 3

    def __getattr__(self, name):
        return 'missing property {}'.format(name)

a = A()
a.x  # 返回3
a.y  # 返回'missing property y'。即访问不存在的成员,会调用__getattr__方法
复制代码
  • 当一个类实现了__setattr__时, 任何地方对这个类的对象增加属性,或者对现有属性赋值,都会调用__setattr__
class A:
    def __init__(self):
        self.x = 3

    def __setattr__(self, name, value):
        print('set {} to {}'.format(name, value))
        setattr(self, name, value)

a = A()
a.x  # 返回3
a.y = 5  # 输出set y to 5
复制代码
  • 当一个类实现了__delattr__ 方法时,删除其实例的属性,会调用此方法
class A:
    def __init__(self):
        self.x = 3

    def __delattr__(self, name):
        print('you cannot delete property: {}'.format(name))

a = A()
a.x  # 返回3
del a.x  # 输出you cannot delete property: x
复制代码

最后多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以进裙930900780领取。

 

本文章素材来源于网络,如有侵权请联系删除。

 

Python程序设计 第7章:Python面向对象编程 Python程序设计 第7章:Python面向对象编程7.1 面向对象编程概述7.1.1 OOP的产生7.1.2 OOP核心思想7.1.3 OOP特征7.2 类和对象7.2.1 类的创建7.2.2 对象的创建7.2.3 类的属性7.2.4 类的方法7.2.5 内部类7.2.6 魔术方法7.3 类间关系7.3.1 依赖关系7.3.2 关联关系7.3.3 继承关系7.4 总结 7.1 面向对象编程概述 7.1.1 OOP的产生 7.1.2 OOP核心思想 7.1.3 OOP特征 7.2 类和对象 7.2.1 类 阅读详情

相关推荐

STM32H745xI双核芯片SMPS/LDO配置误区:从复位失败到精准排查的实战复盘

本文详细分析了STM32H745xI双核芯片在SMPS/LDO配置中的常见误区,特别是复位失败问题的排查过程。通过对比参考板与故障板的波形数据,揭示了电感选型不当导致的电源稳定性问题,并提供了硬件设计检查清单和调试技巧,帮助开发者避免类似陷阱。

weixin_42531588的博客 265

【Python】Speedup

Python 优化提速的 8 个小技巧 文章目录0 代码优化原则1 避免全局变量2 避免函数属性访问3 避免类内属性访问4 避免不必要的抽象5 避免数据复制6 交换值时不使用中间变量7 字符串拼接用 join 而不是+8 利用 if 条件的短路特性9 循环优化用 for 循环代替 while 循环使用隐式 for 循环代替显式 for 循环减少内层 for 循环的计算10 使用 numba.jit11 选择合适的数据结构 0 代码优化原则 不要过早优化——让正确的程序更快要比让快速的程序正确容易得多 权衡优

bryant_meng 545

Mplus实战:三变量随机截距交叉滞后模型(RI-CLPM)语法详解与扩展

本文详细解析了Mplus中三变量随机截距交叉滞后模型(RI-CLPM)的构建原理与语法实现。通过将变量分解为稳定的个体间差异与动态的个体内波动,模型能更纯净地揭示多变量间的纵向交互影响。文章以工作压力、睡眠质量与工作满意度为例,提供了完整的语法模板、关键参数设置(如NOCOV命令、残差相关)及结果解读指南,帮助研究者避开常见误区,稳健分析复杂动态关系。

wdx0123456的博客 926

Python实现基本数据结构---队列操作

#! /usr/bin/env python #coding=utf-8class Queue(object): def __init__(self,size): self.size=size self.head=-1 #初始化队头 self.tail=-1 #初始化队尾 self.queue=[] def EnQueue

爱橙子的OK绷的专栏 1606

从Starlink看NTN:SSB波束数量少,用户体验真的会差吗?

当SpaceX的Starlink以每月新增上百颗卫星的速度扩张其星座时,一个有趣的技术现象正在引发行业讨论:为何这个全球最大的低轨卫星网络选择使用相对较少的波束数量?波束数量的选择远非简单的技术参数,而是系统设计哲学、商业策略与终端用户体验的复杂平衡。传统地面网络可以依赖密集基站实现精准覆盖,而卫星通信必须面对一个根本性挑战:如何在数百公里的高空,用有限的射频资源服务广阔的地理区域。当我们在撒哈拉沙漠测试不同波束方案时,发现了一个关键洞见:最佳波束数量不是固定的技术参数,而是随网络发展阶段变化的动态值。

weixin_32308101的博客 332

ICC2 高效上手 | create_lib 命令全攻略:数字后端工程师的必备秘籍

如果技术文件中的足够满足你的需求,你可以设置,然后运行create_lib命令;如果技术文件的精度不够,那就需要显式地使用来定义缩放因子。在使用create_lib必须显式指定库名(如my_libA推荐优先通过或来关联技术数据,确保你的设计库有正确的工艺基础。显式地通过-ref_libs定义参考库,这样可以避免工具自动推导时可能出现的冲突。慎重使用,只有在对数据精度有特殊需求时才显式指定,并且要确保它与参考库的缩放因子一致。

weixin_50820814的博客 1595

python with语句_Python3 之 with语句(高效、便捷)

在实际的编码过程中,有时有一些任务,需要事先做一些设置,事后做一些清理,这时就需要python3 with出场了,with能够对这样的需求进行一个比较优雅的处理,最常用的例子就是对访问文件的处理。文件读写初级:一般访问文件资源时我们会这样处理:1 f = open(r'c:\mytest.txt', 'r')2 data =f.read()3 f.close()存在两个问题:1. 如果在读写时出现...

weixin_39737831的博客 155

基于YOLOv5的人脸识别系统:从构建到应用的全流程指南

本文详细介绍了基于YOLOv5的人脸识别系统开发全流程。首先阐述了YOLOv5模型的高效性和准确性优势,随后分步骤讲解了深度学习环境配置、数据集准备(推荐WIDER FACE数据集)和模型训练方法。重点展示了如何将训练好的模型集成到Tkinter开发的GUI界面中,实现图片上传、人脸检测和结果可视化功能。文章提供完整的代码示例和飞书文档链接(密码:946m22&8),帮助开发者快速构建可交互的人脸识别系统,适用于安防、门禁等多种应用场景。通过该项目,读者可掌握YOLOv5的实际应用和界面集成技术。

FJN110的博客 169

python之with语句的工作原理

有时一些任务,需要事先做一些设置,事后做一些清理,这时 with 就可以出场了,with能够对这样的需求进行一个比较优雅的处理,最常用的例子就是对访问文件的处理。 文件读写初级: 一般访问文件资源时我们会这样处理: f = open(r'c:\mytest.txt', 'r') data = f.read() f.close() 存在两个问题: 1. 如果在读写时出现异常而忘了异常处理。 2. 忘了关闭文件句柄 文件读写中级: 以下的加强版本的写法: f = open(r'c:\myte

cocos2dGirl的专栏 691

使用 Visual Studio Code 连接 ABAP On-Premise 系统做开发的详细配置步骤

本文详细介绍了如何在Visual Studio Code中通过ABAP Development Tools扩展连接ABAP On-Premise系统。关键步骤包括:通过Ctrl+Shift+P打开命令行面板选择「ABAP: New Destination...」创建RFC连接(仅支持SSO单点登录),选择本地SAPGUI中已有的系统,输入Client ID、语言和用户名(无需密码),最后将目标系统添加到工作区即可开始开发。文章强调了企业安全考虑下仅支持SSO的设计理念,并展示了连接配置的JSON格式示例。整

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 987

导航系统 | 全球四大卫星导航系统(2025)核心能力对比分析

北斗系统通过GEO卫星(80°E、110.5°E、140°E)实现区域增强,其IGSO卫星在亚太地区形成"8"字形轨迹,使该区域可见卫星数量比GPS多4-6颗,显著提升复杂环境下的定位可用性[13]。北斗短报文功能在2025年云南地震救援中发挥关键作用,被困人员通过北斗终端发送120字求救信息,实现"位置+状态"一体化上报,救援响应时间缩短40%[15]。北斗通过三频信号(B1C/B2a/B3)消除电离层延迟误差,在城市峡谷环境下定位连续性达99.98%,优于GPS的99.95%[5]。

尘世冰封的专栏 2614

python实现with上下文管理,__exit__()参数exc_type, exc_val, exc_tb异常处理

自己写一下Python的with语句实现 第一种方法利用魔法方法__enter__和__exit__实现: 顾名思义__enter__是打开上文,__exit__关闭下文,相当于打开文件、关闭文件。 #coding=gbk #第一种,魔法方法实现方法 class WithContext(): def __init__(self,name=None): print('...

wangjinyu124419的博客 5248

基于STM32的智能宠物喂食系统设计与实现(代码+PCB )

STM32;DHT11;本系统的软件程序基于Keil MDK-ARM V5集成开发环境进行编写和编译。Keil MDK是ARM公司官方推荐的嵌入式开发工具,支持ARM Cortex-M系列微控制器的程序开发,内置ARM C/C++编译器、调试器和仿真器,具有代码编辑、语法高亮、工程管理和在线调试等功能,是STM32开发领域应用最为广泛的IDE之一。

3254968421的博客 72

python 运算符重载_零基础小白Python入门必看:面向对象之典型魔术方法

魔术方法查看类的魔术方法class A: passdir(A) # 可以得到类所有公有成员复制代码输出结果如下['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '_...

weixin_39551188的博客 91

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Python 中的魔术方法

统一接口:让自定义类的行为与内置类型(如列表、字典)保持一致(如len(obj)灵活定制:通过重载运算符、属性访问、迭代逻辑等,实现高度定制化的类(如单例、自定义容器、上下文管理器);隐式调用:无需显式调用,由 Python 解释器自动触发,简化代码。实际开发中,无需记忆所有魔术方法,而是根据需求选择(如实现with用__enter____exit__,实现迭代用__iter____next__),并遵循“最小必要”原则——仅实现需要的魔术方法,避免过度复杂。

Tallbo的博客 1471

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Python最会变魔术的魔术方法,我觉得是它!

在但是,文中也提到了一个例外:一个非常神秘的魔术方法。这个方法非常不起眼,用途狭窄,我几乎从未注意过它,然而,当发现它可能是上述“定律”的唯一例外情况时,我认为值得再写一篇文章来详细审视一下它。本文主要关注的问题有:(1) __missing__()到底是何方神圣?(2) __missing__()有什么特别之处?擅长“大变活人”魔术?(3) __missing__()是否真的是上述发现的例外?如果是的话,为什么会有这种特例?

Trb601012的博客 812

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

零基础Python快速入门:新手必看的常见报错与修复指南

本文为Python新手提供了常见报错的快速修复指南,涵盖五大典型错误:语法错误(SyntaxError)、缩进错误(IndentationError)、命名错误(NameError)、类型错误(TypeError)和索引越界(IndexError)。文章强调报错是学习编程的重要反馈,并介绍"READ"调试原则(复现-读懂-分析-搜索)。附带Python环境搭建建议和学习资源推荐,帮助零基础用户快速入门并建立调试思维。

weixin_42636075的博客 1894

Python入门:零基础认识Python,搞懂它能做什么

本文是《Python从入门到精通教程》的开篇章节,主要介绍Python的基础知识和应用场景。文章从Python的核心概念入手,解释其简洁易读、面向对象、跨平台等特点,并展示基本语法示例。重点讲解了Python在数据处理、自动化任务、Web开发和数据分析等领域的应用。通过具体代码示例演示了Python的基本用法、面向对象编程等关键技术点,并提供了常见问题的解决方案。文章旨在帮助零基础学习者快速理解Python的基本概念和实际应用价值,为进一步学习打下坚实基础。

未来 95% 的 AI 应用将变得隐形,广泛融入日常生活。 1万+

Python面向对象:静态方法(@staticmethod)的使用

本文是《Python面向对象编程》系列教程的第七篇,重点讲解静态方法(@staticmethod)的使用。文章首先介绍了静态方法的基本概念和重要性,包括其在提升开发效率、保障代码质量等方面的价值。然后详细解析了静态方法的技术原理和实现方式,通过多个代码示例演示了基础到进阶的应用场景。最后提供了常见问题的解决方案,如环境配置问题和运行时错误处理。全文采用理论结合实践的方式,帮助读者全面掌握静态方法这一Python面向对象编程中的重要特性。

未来 95% 的 AI 应用将变得隐形,广泛融入日常生活。 9365

python面向对象 魔术方法/特殊方法/专有方法

python 面向对象 特点 和其它编程语言相比,Python 在尽可能不增加新的语法和语义的情况下加入了类机制。 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。 对象可以包含任意数量和类型的数据。 python魔术方法/特殊方法/专有方法 python类中有一些...

ihankyang的博客 224

Python最会变魔术的魔术方法,我觉得是它

在上篇文章中,我有一个核心的发现:Python 内置类型的特殊方法(含魔术方法与其它方法)由 C 语言独立实现,在 Python 层面不存在调用关系。 但是,文中也提到了一个例外:一个非常神秘的魔术方法。 这个方法非常不起眼,用途狭窄,我几乎从未注意过它,然而,当发现它可能是上述“定律”的唯一例外情况时,我认为值得再写一篇文章来详细审视一下它。 本文主要关注的问题有: (1) missing()到底是何方神圣? (2) missing()有什么特别之处?擅长“大变活人”魔术? (3) missing()是否

梦子微信 142

想学Python又不知道买哪本书?推荐11本必看书籍

学Python的书有很多,想学Python又不知道买哪本书合适的,可以读一下这篇文章。

Python966的博客 1万+

Python零基础入门

Python是一种高级、解释型的通用编程语言,由Guido van Rossum于1991年首次发布。它以简洁易读的语法著称,特别适合编程初学者入门。简单易学:语法接近自然语言,代码可读性强跨平台:可在Windows、macOS、Linux等系统运行丰富的标准库:包含大量内置模块和函数社区支持:拥有活跃的开发者社区和丰富的第三方库应用广泛:适用于Web开发、数据分析、人工智能等多个领域Python是一种高级、解释型的通用编程语言,由Guido van Rossum于1991年首次发布。

Made In SQL 1944

Python最会变魔术的魔术方法,竟能“大变活人“

我有一个核心的发现:Python 内置类型的特殊方法(含魔术方法与其它方法)由 C 语言独立实现,在 Python 层面不存在调用关系。 但是,文中也提到了一个例外:一个非常神秘的魔术方法。 这个方法非常不起眼,用途狭窄,我几乎从未注意过它,然而,当发现它可能是上述“定律”的唯一例外情况时,我认为值得再写一篇文章来详细审视一下它。 本文主要关注的问题有: (1) __missing__()到底是何方神圣? (2) __missing__()有什么特别之处?擅长“大变活人”魔术? (3)...

387
上一篇: Python 的映射数据类型有哪些?零基础小白入门学习必看
下一篇: 从零开始学python之Python安装和环境配置
python阿喵
博客等级 码龄6年 169粉丝 127原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值