class Age:
def __get__(self, instance, owner):
print('get')
def __set__(self, instance, value):
print('set')
def __delete__(self, instance):
print('del')
class Person:
age=Age()
def __getattribute__(self, item):
print('--->',item)
super().__getattribute__(item)
p=Person()
print(p.age)
p.age=10
del p.age
__getattribute__(item)是类调用对象属性时先执行的方法。可以对该方法进行拦截。比如在pyqt5中创建两个对象,分别为Qlabel,QPushbutton,为了理解__getattribute__()方法,我把btn绑定在self身上(实际给该类绑定了属性,属性为btn),label先部做此操作。
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("的学习")
self.resize(500,500)
label=QLabel('world',self)
label.move(50,50)
self.btn=QPushButton('click',self) #绑定在self身上,即btn做为了Window类的属性。
self.btn.setObjectName('btn')
self.btn.resize(50,30)
self.btn.clicked.connect(lambda :self.btn_change_color('btn'))
def btn_change_color(self,name):#
print(self.__getattribute__(name))
运行结果为:<PyQt5.QtWidgets.QPushButton object at 0x000001A1CFDF83A0>
可以发现__getattribute__调用了btn属性,这样就找到了该对象。
为了便于理解,看下面例子,
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("的学习")
self.resize(500,500)
self.label=QLabel('world',self)
self.label.move(50,50)
self.btn=QPushButton('click',self)
self.btn.resize(50,30)
self.btn.clicked.connect(lambda :self.btn_change_color('label'))
def btn_change_color(self,name):
self.__getattribute__(name).setStyleSheet('background-color:yellow')
self.__getattribute__(name).resize(60,50)