python中各种下划线(_xxx、__xxx__ 、__xxx)的含义

本文详细介绍了Python中使用下划线前缀和后缀的特殊变量及其用途,包括保护变量、私有变量及语言定义的特殊方法。同时列举了一系列内置方法如__init__(), __str__(), __add__()等,并解释了它们的调用方式和应用场景。

Python 用下划线作为变量前缀和后缀指定特殊变量,主要有以下几种:

_xxx   :保护变量,意思是只有类对象和子类对象能够访问到这些变量(尽量避免在类外部直接修改)

__xxx__ :python语言定义的特殊方法

__xxx  :类中的私有变量名

核心风格:避免用下划线作为变量名的开始

类的基础方法
序号    目的                                   所编写代码                   Python 实际调用
①    初始化一个实例                   x = MyClass()                   x.__init__()
②    字符串的“官方”表现形式         repr(x)                           x.__repr__()
③    字符串的“非正式”值                 str(x)                             x.__str__()
④    字节数组的“非正式”值            bytes(x)                          x.__bytes__()
⑤    格式化字符串的值            format(x,format_spec)         x.__format__(format_spec)

  1. 对 __init__() 方法的调用发生在实例被创建 之后 。如果要控制实际创建进程,请使用 __new__()方法。
  2. 按照约定, __repr__() 方法所返回的字符串为合法的 Python 表达式。
  3. 在调用 print(x) 的同时也调用了 __str__() 方法。
  4. 由于 bytes 类型的引入而从 Python 3 开始出现。

python中以双下划线的是一些系统定义得名称,让python以更优雅得语法实行一些操作,本质上还是一些函数和变量,与其他函数和变量无二。
比如x.__add__(y) 等价于 x+y
有一些很常见,有一些可能比较偏,在这里罗列一下,做个笔记,备忘。
x.__contains__(y) 等价于 y in x, 在list,str, dict,set等容器中有这个函数
__base__, __bases__, __mro__, 关于类继承和函数查找路径的。
class.__subclasses__(), 返回子类列表
x.__call__(...) == x(...)
x.__cmp__(y) == cmp(x,y)
x.__getattribute__('name') == x.name == getattr(x, 'name'),  比__getattr__更早调用
x.__hash__() == hash(x)
x.__sizeof__(), x在内存中的字节数, x为class得话, 就应该是x.__basicsize__
x.__delattr__('name') == del x.name
__dictoffset__ attribute tells you the offset to where you find the pointer to the __dict__ object in any instance object that has one. It is in bytes.
__flags__, 返回一串数字,用来判断该类型能否被序列化(if it's a heap type), __flags__ & 512
S.__format__, 有些类有用
x.__getitem__(y) == x[y], 相应还有__setitem__, 某些不可修改类型如set,str没有__setitem__
x.__getslice__(i, j) == x[i:j], 有个疑问,x='123456789', x[::2],是咋实现得
__subclasscheck__(), check if a class is subclass
__instancecheck__(), check if an object is an instance
__itemsize__, These fields allow calculating the size in bytes of instances of the type. 0是可变长度, 非0则是固定长度
x.__mod__(y) == x%y, x.__rmod__(y) == y%x
x.__module__ , x所属模块
x.__mul__(y) == x*y,  x.__rmul__(y) == y*x

__reduce__, __reduce_ex__ , for pickle

__slots__ 使用之后类变成静态一样,没有了__dict__, 实例也不可新添加属性

__getattr__ 在一般的查找属性查找不到之后会调用此函数

__setattr__ 取代一般的赋值操作,如果有此函数会调用此函数, 如想调用正常赋值途径用 object.__setattr__(self, name, value)

__delattr__ 同__setattr__, 在del obj.name有意义时会调用

 
原文:https://blog.youkuaiyun.com/qq_14935437/article/details/82746257 

<think>嗯,用户问的是PyQt5中self.xxx.raise_()的用法或者相关问题。我需要先回忆一下PyQt5中raise_()方法的作用。记得这个方法通常用于控件的层级管理,比如让某个控件显示在最上层,避免被其他控件遮挡。可能用户遇到了控件覆盖的问题,想通过raise_()来解决。 首先,得解释raise_()的基本功能。在PyQt5中,当多个控件有重叠的时候,它们的显示顺序由父控件中的添加顺序决定,后添加的会覆盖先添加的。但有时候需要动态调整,这时候可以用raise_()方法。比如,点击按钮时让某个面板显示到最前面。 然后,要注意的是raise_()是QWidget的方法,所以任何继承自QWidget的控件都可以调用这个方法。同时,可能需要提到参数,比如是否接受布尔参数,但根据文档,raise_()方法没有参数,调用时直接self.widget.raise_()即可。 接下来,用户可能会遇到的问题有哪些呢?比如,调用raise_()之后没有效果,这时候需要检查父控件是否正确,或者是否布局管理器的问题。另外,可能需要结合stacked widget来管理多个页面,这时候raise_()可能不是最优解,而应该使用setCurrentIndex之类的。 还要注意,raise_()和lower()是相反的操作,前者提升到顶部,后者降低到底部。可能用户需要动态切换多个层叠的控件,这时候这两个方法都有用。 另外,代码示例是必须的。比如,创建一个窗口,里面有两个按钮,点击其中一个按钮时,调用raise_()方法让对应的控件显示在最上层。这样用户可以看到实际的应用方式。 可能还需要提到布局管理的影响,比如如果使用了布局管理器,调整Z-order可能受到布局的限制,这时候需要确认布局是否正确设置。或者是否在父控件中添加了正确的子控件。 此外,关于raise_()的常见错误,比如拼写错误,注意方法名后面有个下划线,因为raise是Python的关键字,所以PyQt5用raise_()来避免冲突。这点需要强调,避免用户因为拼写错误而无法调用方法。 最后,生成相关问题的时候,应该围绕控件层级管理、常见问题排查、替代方法、布局影响等方面来提问。比如,如何动态切换控件可见性,或者如何调整多个窗口的显示顺序。</think>在PyQt5中,`self.xxx.raise_()`用于控制控件层级关系,使其显示在最顶层。以下是详细说明和常见问题解决方案: ### 核心功能 1. **Z轴调整** `raise_()`方法将控件提升到同级控件的最前端显示,常用于解决控件遮挡问题。例如: ```python self.button.raise_() # 将按钮置于同级控件的最上层 ``` 2. **参数特性** 此方法**无需参数**,直接调用即可。注意`raise`是Python关键字,因此PyQt5使用`raise_()`命名[^1]。 ### 典型场景 ```python class MyWindow(QWidget): def __init__(self): super().__init__() self.label1 = QLabel("底层标签", self) self.label2 = QLabel("顶层标签", self) # 初始显示顺序 self.label1.setGeometry(10,10,200,200) self.label2.setGeometry(50,50,200,200) # 强制将label1提升到顶层 self.label1.raise_() ``` ### 常见问题排查 | 问题现象 | 解决方案 | |---------|----------| | 调用后无变化 | 检查父容器是否相同,不同父容器的控件无法通过此方法调整层级 | | 布局管理器干扰 | 在`QGridLayout`/`QVBoxLayout`中,建议改用`QStackedWidget`管理层级 | | 动态效果失效 | 调用后需配合`update()`或`repaint()`强制刷新界面 | ### 替代方案 对于复杂界面管理,推荐使用: ```python stack = QStackedWidget() stack.addWidget(page1) stack.addWidget(page2) stack.setCurrentIndex(1) # 切换到page2 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值