Python基础(十二)—面向对象拾遗(__slots__、@property、枚举类、元类)

PySide(PyQT)的@Slot()、@pyqtSlot()装饰器的作用 使用@Slot()装饰器:推荐在需要严格类型检查、跨线程调用或追求更好性能的场景中使用。它可以提供更明确的类型信息和更好的线程安全性。不使用@Slot()装饰器:适用于简单的场景,当你不需要严格的类型检查,并且不涉及跨线程调用时,可以简化代码。 阅读详情

编译型语言和解释型语言

  • 编译型语言
    • 定义
      需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。
      • 编译是把源代码编译成机器码
      • 链接是把各个模块的机器码和依赖库串连起来生成可执行文件
    • 优缺点
      • 优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。
      • 缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。
    • 代表语言
      C、C++、Pascal、Object-C以及最近很火的苹果新语言swift
  • 解释型语言
    • 定义
      解释性语言的程序不需要编译,相比编译型语言省了道工序,解释性语言在运行程序的时候才逐行翻译。
    • 优缺点:
      • 优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。
      • 缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。
    • 代表语言
      JavaScript、Python、Erlang、PHP、Perl、Ruby

动态语言和静态语言

  • 静态类型语言
    • 定义
      类型判断是在运行前判断(如编译阶段),比如C#、java就是静态类型语言,静态类型语言为了达到多态会采取一些类型鉴别手段,如继承、接口
    • 优缺点
      优点:结构非常规范,便于调试,方便类型安全;缺点:为此需要写更多的类型相关代码,导致不便于阅读、不清晰明了。
  • 动态语言
    • 定义
      程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化,类型的检查是在运行时做的。
    • 优缺点
      优点:方便阅读,不需要写非常多的类型相关的代码;缺点:不方便调试,命名不规范时会造成读不懂,不利于理解等。
  • 关于弱类型、强类型、动态类型、静态类型语言的划分
    类型划分.png

使用__slots__

限制实例的属性

  • 动态语言动态绑定属性和方法
    当定义了一个class,创建实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性,绑定方式及效果请看以下代码

对实例绑定的属性或方法只对绑定实例有效,对另外实例无效。采用给class绑定,则对所有实例均有效。

class Student:
    pass

s1 = Student()
s1.name = 'lz'
print(s1.name)  # lz

s2 = Student()
# print(s2.name)  # 报错:AttributeError: 'Student' object has no attribute 'name'

def set_age(self, age):
    self.age = age
from types import MethodType
s1.set_age = MethodType(set_age, s1)
s1.set_age(17)
print(s1.age)  # 17,对s2不起作用

# 对实例绑定的属性或方法只对绑定实例有效,对另外实例无效。采用给class绑定,则对所有实例均有效。
Student.set_age = MethodType(set_age ,Student)
s3 = Student()
s3.set_age(20)
print(s3.age)  # 20

  • 使用__slots__限制实例的属性
    如果想要限定实例的属性,可以使用__slots__对类属性进行限制,但是只对当前类的实例有效,对其子类无效。
class Fish:
    __slots__ = ('name', 'age', 'sex')  # 如果这里没有sex,则下面的print会报错没有该属性

    def __init__(self, sex):
        self.sex = sex

f1 = Fish('man')
print(f1.sex)

# f1.size = 18  # 报错没有该属性

@property

@property广泛应用于类的定义中,可以简化代码,同时保证对参数进行必要的检查,检查程序运行的出错。

在Python基础(十)—面向对象的深入讲解(继承、Mixin编程机制等)章节中,说的是property(fget=None, fset=None, fdel=None, doc=None):通过类定义的属性设置属性。和@property有本质区别.

  • 范围限定
    例如我们新建Student,在设置成绩sorce属性上,我们是要对sorce进行范围限定的,这个就需要在class中的set方法中进行相对的限定,如下代码:
class Student:
    def get_sorce(self):
        return self.sorce
    def set_sorce(self, value):
        if not isinstance(value, int):
            raise ValueError('sorce必须是Int')
        if value < 0 or value > 100:
            raise ValueError('sorce必须介于0~100')
        self._sorce = value

单下划线和双下划线都是限定属性的私有

  • 使用@property装饰器讲方法变为属性
    @property可以使方法变为属性的方式进行访问,以上代码修改为:
class Student:
  @property
  def sorce(self):
      return self.sorce

  @sorce.setter
  def set_sorce(self, value):
      if not isinstance(value, int):
          raise ValueError('sorce必须是Int')
      if value < 0 or value > 100:
          raise ValueError('sorce必须介于0~100')
      self._sorce = value
#把一个getter方法加上@property,就变成了属性,同时@property本身又创建了另一个装饰器@sorce.setter,负责把一个setter方法变成属性赋值,这样就拥有了一个可控的属性操作。
  • 利用@property进行属性的读写限制
    如果之定义getter方法,而不定义setter方法,那该属性则是只读的,从以下方法可看出,age不需要可写,只需当前时间减去birth即可,因此设置为只读。
class Man:
  @property
  def birth(self):
      return self._birth
  @birth.setter
  def birth(self, value):
      self._birth = value
  
  @property
  def age(self):
      return 2019-self._birth
  }

使用枚举类

  • 使用枚举类的好处
    对于一些常量(星期,月份等),使用不可变的枚举类,即增加了可读性,也不用担心出错,并且枚举类在内存中存放的是数字,也提高了程序效率,同时成员还可以直接比较。
  • 创建枚举类
    枚举类型可以通过继承Enum类来实现,注意Enum类是在enum模块中的。
from  enum import Enum
class VIP(Enum):
    YELLOW = 1
    RED = 2
    BLUE = 3
    ```
  * 查看枚举类型
    枚举类型是一个特殊的类,我们可以查看它的名称和值。
```javascript
print(VIP.YELLOW) #枚举类型
print(VIP['YELLOW']) #枚举类型
print(VIP.YELLOW.name) #枚举名称
print(VIP.YELLOW.value)  #枚举值
print(VIP(3)) #数字得到枚举类型

#遍历
for v in VIP:  #遍历
    print(v)

# 成员的value默认从1开始
for name, member in VIP.__members__.items():
    print(name, "->", member, ',', member.value)
"""
YELLOW -> VIP.YELLOW , 1
RED -> VIP.RED , 2
BLUE -> VIP.BLUE , 3
"""
  • 重复和唯一的枚举类型
    当存在枚举成员的名称有重复时,则后面的枚举成员相当于第一个枚举成员的别名,而且在实际使用中,就是使用的第一次出现的枚举成员。
from enum import Enum, unique
@unique
class Mistake(Enum):
    ONE = 1
    TWO = 2
    THREE = 3
    FOUR = 3
"""
出错:ValueError: duplicate values found in <enum 'Mistake'>: FOUR -> THREE
"""
  • 枚举类型的比较
    枚举类型不能做大小比较,但是可以做身份比较和等值比较。枚举类型没有定义比较运算符,通常不能进行大小比较(不过,继承“IntEnum"类的枚举类型可以进行大小比较,他们的枚举值只能是整数)。

枚举类型是使用单例模式实现的。在创建枚举类的时候,Python就在内存中为我们创建了枚举类的对象,因此我们不必实例化枚举类。并且由于枚举类的“new”方法,将会保证内存中只会存在一个枚举类的实例。

type()创建类

动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是在运行时动态创建的。

  • 假如我们定义了Hello的class,并保存为hello.py.当Python解释器载入hello.py模块时,会依次执行该模块的所有语句,执行的结果就是动态地创建出一个hello的class对象,测试如下(type()可以查看一个类型或变量的类型):
class Hello(object):
    def hello(self, name='world'):
        print('hello %s.' % name)

h = Hello()
print(type(Hello))  # <class 'type'>
print(type(h))   # <class '__main__.Hello'>

# Hello是一个class,类型为type,h是一个实例,它的类型就是class Hello
  • type()不仅可以查看一个对象的类型,还可以使用type()函数创建一个class,以下使用type()创建上面的Hello类,无需使用class
def hl(self, name='world'):
    print('hello %s.' % name)
Hello = type('Hello', (object,), dict(hello = hl))  # 创建Hello的类

h = Hello()
h.hello()
print(type(Hello))
print(type(h))
"""
hello world.
<class 'type'>
<class '__main__.Hello'>
"""
  • 使用type()创建类的三个参数介绍
    • class的名称;
    • 继承的父类集合:tuple的格式(单元素写法),支持多重继承;
    • class的方法名称与函数绑定

通过type()函数创建类与直接写class是完全一样的,因为Python解释器遇到class定义时,仅是扫描class定义的语法,然后调用type()进行创建class,这也就是动态语言支持运行期间创建类。

metaclass 元类

  • metaclass的解释
    • 当我们定义了类之后,就可以根据这个类创建出实例,所以:先定义类,然后创建实例
    • 如果我们想创建出类,那就必须根据metaclass创建出类,所以:先定义metaclass,然后创建类
    • 因此连接起来就是:先定义metaclass,就可以创建类,然后创建实例。

所以 metaclass 允许你创建类或修改类,也就是你可以把类看成是 metaclass 创建出来的“实例”。

  • 实际运用很少,后续略…

个人博客:Loak 正 - 关注人工智能及互联网的个人博客
文章地址:Python基础(十二)—面向对象拾遗(_slots_、@property、枚举类、元类)

Python __slots__属性的实例详解,提高类的效率和可读性 Python的内置类属性__slots__,它提供了一种强大的机制,用于限制类的属性,从而改进内存使用和属性访问速度。在本文中,将深入研究__slots__的作用、用法和示例代码,以帮助大家更好地理解和利用这一特性。 阅读详情

相关推荐

MaxEnt物种分布预测中的常见误区与优化技巧:如何提高模型准确率

本文深入探讨了MaxEnt物种分布预测模型从基础应用到精准预测的进阶实践。针对模型准确率提升,文章系统分析了环境变量筛选、模型参数调优、结果批判性解读等核心环节的常见误区,并提供了基于生态位模型原理的深度优化技巧,帮助研究者产出更可靠、可解释的预测结果。

weixin_29219539的博客 595

9_Python进阶_slot用法

在Python中,每个类都有实例属性。 默认情况下Python用⼀个字典来保存⼀个对象的实例属性,允许我们在运⾏时去设置任意的新属性。对于有着已知属性的小类来说,这个字典浪费了很多内存。 Python不能在对象创建时直接分配⼀个固定量的内存来保存所有的属性。创建许多对象(千万级别),会消耗掉很多内存。不过还是有⼀个⽅法来规避这个问题。这个⽅法需要使⽤__slots__来告诉Python不要使用字典,⽽且只给⼀个固定集合的属性分配空间。 后者的写法会减小40%左右的内存空间。...

m0_48948682的博客 515

Android11,无障碍服务模拟多手势使用dispatchGesture时总是onCancelled

AccessibilityService的dispatchGesture去模拟多手势,总是onCancelled的一种解决办法

m0_49953943的博客 2105

python 的插槽(__slot__)和命名元组

''' 一、插槽(slot)。 在类中使用__slots__来限制类属性的扩展。 例如: ''' class A: __slots__=['x','y'] #把类属性限制为x,y,两个属性。 pass a=A() a.x=3 print(a.x) #结果为3 #a.w=5 #错误 ''' 3 Traceback (most recent call last): File "python笔记.py", line 13, in <module> .

刨食的兔子 1369

知识图谱与人工智能本体论:构建机器认知的语义基石

本文探讨了知识图谱与人工智能本体论如何作为机器认知的语义基石,让AI从‘知道数据’迈向‘理解知识’。文章详细拆解了本体论的核心构件与构建方法,并阐述了从本体到知识图谱的实践路径,包括知识获取、融合、存储及推理应用,最终分析了其在智能搜索与专家系统等场景中带来的根本性重塑。

nginx7reverse的博客 910

Java开发者必看:如何快速对接七大主流快递API(附完整代码示例)

本文为Java开发者提供了快速对接顺丰、京东、DHL等七大主流快递API的实战指南。文章深入剖析了不同API的认证、通信协议与参数差异,并提供了高可用的HTTP客户端配置、通用签名工具、SOAP请求处理以及可扩展的领域模型与适配层设计等完整代码示例,帮助开发者构建统一、健壮的物流集成框架,显著提升开发效率。

tech5的博客 728

python优化之-slot

slot优化python内存

Shine_mmm 1024

新手也能玩转!用Panosim+MATLAB/Simulink搭建你的第一个智能驾驶仿真场景(保姆级图文)

本文为新手提供了使用Panosim和MATLAB/Simulink搭建智能驾驶仿真场景的详细教程。从环境准备、基础场景创建到仿真模型构建,一步步指导用户完成第一个智能驾驶仿真项目,帮助零基础用户快速上手并体验智能驾驶仿真的乐趣。

weixin_29090089的博客 185

python的`__slots__`属性

python的__slots__属性 我们先看一个问题: 对象(通过类实例化后的对象)如何储存自己的属性?

phoenix_wangxd的博客 1045

LeRobot X-VLA:首个适用于任意机器人、任意任务的软提示机器人基础模型

X-VLA是一种基于软提示的视觉-语言-动作模型,通过可学习嵌入向量编码不同机器人配置,实现跨平台统一控制。该框架采用两阶段训练:先在29万次多平台任务中学习通用策略,再通过微调少量参数(仅1%)适配新机器人。实验表明,0.9B参数的X-VLA在6个仿真和3个真实平台上表现优异,如LIBERO任务达93%成功率,布料折叠任务100%完成。其核心创新是将硬件差异视为"任务",用软提示引导Transformer处理异构数据,为机器人基础模型提供可扩展方案。

2506_90492529的博客 1241

C# MES通信从入门到精通(1)——串口传输文件

本文详细介绍了在Mes通信领域如何使用串口发送文件,由实战经验总结,堪称MES通信领域的葵花宝典!

qq_34059233的博客 3753

python动态添加属性_Python __slots__:限制类实例动态添加属性和方法

通过学习《Python类变量和实例变量》一节,了解了如何动态的为单个实例对象添加属性,甚至如果必要的话,还可以为所有的类实例对象统一添加属性(通过给类添加属性)。那么,Python 是否也允许动态地为类或实例对象添加方法呢?答案是肯定的。我们知道,类方法又可细分为实例方法、静态方法和类方法,Python 语言允许为类动态地添加这 3 种方法;但对于实例对象,则只允许动态地添加实例方法,不能添加类方...

weixin_36121198的博客 267

Python爬虫实战:利用最新技术爬取抖音话题挑战视频

本文将详细介绍如何使用Python最新技术栈构建一个高效的抖音话题挑战视频爬虫。我们将从环境配置开始,逐步讲解请求模拟、数据解析、反反爬策略、数据存储等关键环节,并提供完整的代码实现。本文适合有一定Python基础的开发者学习高级网络爬虫技术。关键词:Python爬虫、抖音API、话题挑战、视频爬取、反反爬本文详细介绍了如何使用Python最新技术栈构建抖音话题挑战视频爬虫。我们从基础请求开始,逐步实现了数据解析、反反爬策略、数据存储等核心功能,并探讨了分布式和增量爬取等高级主题。更智能的反反爬策略。

2201_76125261的博客 1745

Python:__slots__()方法和@property方法

1、__slots__ 1、python作为一个动态语言,可以在创建一个class类后,给类进行绑定属性和方法。但是当我们想要限制实例的属性和方法时怎么办?这个时候就可以用到__slots__()方法。 无图无真相,直接上代码: class Student(object): __slots__ = ('name','age') 然后我们尝试添加属性: ''' 遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程

Python热爱者的博客 416

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

@pyqtSlot()有什么作用?

在 PyQt5 应用程序中,@pyqtSlot() 是一个装饰器(decorator),它的作用主要是标记一个函数作为 Qt 框架中的“槽”(Slot)。在涉及多线程编程时,特别是当信号从工作线程发送到主线程更新UI时,使用带有适当 @pyqtSlot() 注解的槽函数有助于确保信号在安全地传递给主线程槽函数时能够正确排队并异步执行。尽管 Python 允许任意可调用对象作为槽,但使用 @pyqtSlot() 装饰器可以使代码更易于理解和维护,因为阅读者会明确知道这是一个设计用来与信号连接的槽函数。

公众号:风景邮递Yuan的博客 2048

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

python @ 修饰符的作用

最近在学pyqt5,遇到的一些知识点记录一下,在Python的函数中偶尔会看到函数定义的上一行有@functionName的修饰。 解释:当解释器读到@的这样的修饰符之后,会先解析@后的内容,直接就把@下一行的函数或者类作为@后边的函数的参数,然后将返回值赋值给下一行修饰的函数对象。 比如: @a @b def c(): … python会按照自下而上的顺序把各自的函数结果作为下一个函数(上面...

stefan1240的专栏 1773

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

python--pyQt5 页面刷新\线程刷新\界面卡顿 - 信号与槽-- 多线程处理(线程的开始/暂停/恢复/取消)同时运行两个不同的线程 pyside6

刷新界面命令:QApplication.processEvents()

weixin_45939263的博客 4350

Python 面向对象 继承 多态 slots等特殊方法 【进阶篇 1 】

本文主要对python的面向对象编程、类的继承、多态、获取对象的信息的方法、class类与实例化、类和实例化的属性以及优先级对比、python中的一些特殊方法:__str__、__repr__、__len__、__add__等

weixin_43483590的博客 1221

python之__slots__关键字

""" 1.__slots__ 可以对动态添加成员属性做限制(对类属性没有限制) 2.__slots__ 可以对动态添加成员方法做限制(对静态方法没有限制) 3.__slots__ 对子类起不到限制作用 """ import types class Person(): __slots__ = ('name', 'age') def __init__(self, name, a...

why404 469

Python __slots__属性的实例详解,提高类的效率和可读性!

_slots__

涛哥聊Python 1170

Pyside2中@Slot 装饰器用法

通常,槽方法返回 None,但是你也可以在槽方法中指定返回值。如果信号的发射不依赖于返回值,那么你可以忽略返回值。@Slot()")return 42 # 你可以返回值,但信号系统不会使用这个返回值@Slot 装饰器可以避免手动调用 connect() 来连接信号和槽。可以为带有参数的信号和槽使用 @Slot 装饰器,确保槽方法的参数类型与信号的参数类型一致。@Slot 提供了一种简化的方式来处理信号与槽的连接,尤其是当项目较大时,它能让代码更加简洁和易于维护。

weixin_43411094的博客 839

python类:面向对象、继承、slot、多重继承

http://blog.youkuaiyun.com/pipisorry/article/details/46381341 python面向对象基础知识 面向对象的三大特性:封装、继承和多态。 [Python 面向对象(初级篇)] 皮皮Blog 继承 在Python中,同时支持单继承与多继承,一般语法如下: class SubClassName(ParentClass1 [, Pare...

皮皮blog 5689

Python深入理解__slots__

类魔法方法__slots__ python类声明中如果没有添加__slots__参数,类属性是可以随时随地添加的,因此在生成类实例的时候,python除了会给已经定义的属性值分配内存,还会预留一部分空间以方便未来增加属性值。 __slots__的作用就是声明这个类只会这些属性,也就不必多分配内存了,因此虽然属性固定但节省内存。适用于需要生成大量类实例的场景。 ...

weixin_39253570的博客 8475

python __slot__的用法

__slots__魔法 在Python中,每个类都有实例属性。默认情况下Python用一个字典来保存一个对象的实例属性。这非常有用,因为它允许我们在运行时去设置任意的新属性。 然而,对于有着已知属性的小类来说,它可能是个瓶颈。这个字典浪费了很多内存。Python不能在对象创建时直接分配一个固定量的内存来保存所有的属性。因此如果你创建许多对象(我指的是成千上万个),它会消耗掉很多内存。

qq_35636311的博客 1万+

python PyQt5 slot插槽(pyqtSignal、pyqtSlot)

https://doc.qt.io/qtforpython/PySide2/QtCore/Slot.html# 细节描述 PySide2照原样采用了PyQt5的新信号和插槽语法。PySide2实现与PyQt5兼容,但以下列出的除外。 PyQt5的新信号和插槽样式利用了特定于其实现的方法和装饰器名称。这些将根据下表进行概括: Q_INVOKABLE 由于PySide2插槽实际上可以具有返回值,因此...

Dontla的博客 2055

Python学习之面向对象编程思想———拾遗

最近在学习小甲鱼的Python课程,学到了对魔法方法覆写(重写?重载?)这一块,先不bb,贴代码 class Cel: def __init__(self,value = 20.0): self.value = float(value) def __get__(self,instance,owner): return self.value def __set__(self,ins...

JC_gogo的博客 337
上一篇: Python基础(十三)—切片、yield、生成器、序列化JSON
下一篇: Python基础(十四)—装饰器 wrapper
luoz_python
博客等级 码龄10年 57粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值