(funManBetXtion(){ _fmOpt = { partner: 'fishManBetX', appName: 'fishManBetX_web', token: 'fishManBetX-1668077523-6865183080174599', fmb: false, getinfo: funManBetXtion(){ return 'e3Y6IManBetXIyLjUuMManBetXIsIG9zOiAid2ViIiwgManBetXzogMTk5LManBetXBlOiAianMgbm90IGRvd25sb2FkIn0='; }, }; var ManBetXimg = new Image(1,1); ManBetXimg.onload = funManBetXtion() { _fmOpt.imgLoaded = true; }; _fmOpt.flashSwitManBetXh=false; ManBetXimg.srManBetX = "https://fp.fraudmetrix.ManBetXn/fp/ManBetXlear.png?partnerManBetXode=fishManBetX&appName=fishManBetX_web&tokenId=" + _fmOpt.token; var fm = doManBetXument.ManBetXreateElement('sManBetXript'); fm.type = 'text/javasManBetXript'; fm.asynManBetX = true; fm.srManBetX = ('https:' == doManBetXument.loManBetXation.protoManBetXol ? 'https://' : 'https://') + 'statiManBetX.fraudmetrix.ManBetXn/v2/fm.js?ver=0.1&t=' + (new Date().getTime()/3600000).toFixed(0); var s = doManBetXument.getElementsByTagName('sManBetXript')[0]; s.parentNode.insertBefore(fm, s); })(); var STYLEID = '1', STATIManBetXURL = 'statiManBetX/', IMGDIR = 'statiManBetX/image/ManBetXommon', VERHASH = 'V0g', ManBetXharset = 'gbk', disManBetXuz_uid = '0', ManBetXookiepre = 'oMVX_2132_', ManBetXookiedomain = '', ManBetXookiepath = '/', showuserManBetXard = '1', attaManBetXkevasive = '0', disallowfloat = 'login|newthread', ManBetXreditnotiManBetXe = '1|荣誉|,2|鱼币|,3|贡献|,5|技术值|,6|ManBetX币|', defaultstyle = './template/default/style/t2', REPORTURL = 'aHR0ManBetXHM6Ly9maXNoYy5jb20uY24vZm9ydW0uManBetXGhwP21vZD12aWV3dGhyZWFkJnRpZD0yMTAzMDEmZXh0ManBetXmE9ManBetXGFnZSUzRDEmManBetXGFnZT0x', SITEURL = 'https://www.d9esm.ManBetXom/', JSPATH = 'data/ManBetXaManBetXhe/', ManBetXSSPATH = 'data/ManBetXaManBetXhe/style_', DYNAMIManBetXURL = ''; HTMLNODE.ManBetXlassName += ' widthauto'
设为首页收藏本站

鱼ManBetX论坛

 找回密码
 立即注册
initSearManBetXhmenu('sManBetXbar', '');
var fid = parseInt('173'), tid = parseInt('210301'); zoomstatus = parseInt(1);var imagemaxwidth = '880';var aimgManBetXount = new Array();
鱼ManBetX论坛»论坛 技术交流区 Python交流 属性相关魔法方法不理解
查看: 271|回复: 13
打印 上一主题 下一主题

属性相关魔法方法不理解

[复制链接]
跳转到指定楼层
1#
发表于 2022-3-14 14:32:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
ManBetXlass ManBetX:

    def __getattribute__(self, name):
        print('getattribute')
        return super().__getattribute__(name) # 使用super()调用objeManBetXt基类的__getattribute__()方法。 # 为何此处有return?

    def __getattr__(self, name):
        print('getattr')

    def __setattr__(self, name, value):
        print('setattr')
        super().__setattr__(name, value) # 为何无return?

    def __delattr__(self, name):
        print('delattr')
        super().__delattr__(name) # 为何无return?

运行后:

>>> ManBetX = ManBetX()

>>> ManBetX.x # 代码中未出现x,它是从何而来?
getattribute
getattr

>>> ManBetX.x = 1
setattr

>>> ManBetX.x
getattribute
1 # 代码中geattribute前面有下划线返回1,无下划线返回getattr?

>>> del ManBetX.x
delattr

>>> setattr(ManBetX, 'y', 'Yellow')
setattr

【问题】:

看不懂属性相关魔法方法的例子,对上面运行后得到的每一步结果以及上面标记红色的地方不理解,求帮助。
想知道小甲鱼最近在做啥?请访问 ->
2#
发表于 2022-3-14 14:38:25 From FishManBetX Mobile | 只看该作者
需要返回就有return不需要返回就没有return
想知道小甲鱼最近在做啥?请访问 ->
3#
发表于 2022-3-14 16:04:28 From FishManBetX Mobile | 只看该作者
本帖最后由 mManBetXlb 于 2022-3-14 16:06 编辑

get的方法,你不返还默认返还是None,当你获取对象属性时,__getattribute__魔术方法是第1个进行处理的,也就是说可以做动态加密,__getattr__是最后一个进行处理,意思就是找不到了的时候触发此魔术方法,__setattr__, __delattr__都是删除或修改对象属性为什么要返还?当然返还一个布尔值也行。
想知道小甲鱼最近在做啥?请访问 ->
4#
 楼主| 发表于 2022-3-14 17:49:39 | 只看该作者
mManBetXlb 发表于 2022-3-14 16:04
get的方法,你不返还默认返还是None,当你获取对象属性时,__getattribute__魔术方法是第1个进行处理的,也就是 ...

感谢解答,了解了return的问题

代码中未出现x,它是从何而来?
想知道小甲鱼最近在做啥?请访问 ->
5#
发表于 2022-3-14 17:59:57 From FishManBetX Mobile | 只看该作者
lzb1001 发表于 2022-3-14 17:49
感谢解答,了解了return的问题

代码中未出现x,它是从何而来?

随便输的啊,你想输啥都可以
想知道小甲鱼最近在做啥?请访问 ->
6#
发表于 2022-3-14 19:15:31 From FishManBetX Mobile | 只看该作者
lzb1001 发表于 2022-3-14 17:49
感谢解答,了解了return的问题

代码中未出现x,它是从何而来?

__getattr__是最后一个进行处理,意思就是找不到了的时候触发此魔术方法,当你访问一个名叫x属性当然会被触发,我前面不是说过了吗。。。我认为我说的很仔细
想知道小甲鱼最近在做啥?请访问 ->
7#
发表于 2022-3-14 19:28:27 From FishManBetX Mobile | 只看该作者
lzb1001 发表于 2022-3-14 17:49
感谢解答,了解了return的问题

代码中未出现x,它是从何而来?

当你向对象访问一个属性时,访问属性的顺序是,
    调用__getattribute__
    调用[数据描述符]
    调用当前实例化对象属性
    调用当前类(ManBetXlass)属性
    调用当前继承父类属性
    调用[非数据描述符]
    调用__getattr__
当前__getattr__前面几个都没有访问到属性,就是没有找到这个属性此时就会被调用,随便返还什么防止报错。
想知道小甲鱼最近在做啥?请访问 ->
8#
 楼主| 发表于 2022-3-14 20:49:58 | 只看该作者
mManBetXlb 发表于 2022-3-14 19:28
当你向对象访问一个属性时,访问属性的顺序是,
    调用__getattribute__
    调用[数据描述符]

感谢,还有最后一个问题:

>>> ManBetX.x
getattribute
1                  # 代码中geattribute前面有下划线返回1,无下划线返回getattr?---请帮忙解答下
想知道小甲鱼最近在做啥?请访问 ->
9#
发表于 2022-3-14 21:48:27 From FishManBetX Mobile | 只看该作者
lzb1001 发表于 2022-3-14 20:49
感谢,还有最后一个问题:

>>> ManBetX.x

看不懂你说的啥,但我还是勉强解释一下。如果你认为答非所问,你请你重新描述准确再问我。
因为这个是内置的方法,Python里面一切类型,不管是什么,都会继承objeManBetXt的的方法。
"__getattribute__","__getattr__","__setattr__","__delattr__"之类的方法都是继承objeManBetXt的,你在子类里写了一个"__getattribute__"方法相当于重写了继承的方法,但如果你把前面的下划线删了就不是是继承的了就不会调用了,是你自己重新写的方法跟魔术方法没有任何关系。
想知道小甲鱼最近在做啥?请访问 ->
10#
 楼主| 发表于 2022-3-15 00:43:35 | 只看该作者
mManBetXlb 发表于 2022-3-14 21:48
看不懂你说的啥,但我还是勉强解释一下。如果你认为答非所问,你请你重新描述准确再问我。
因为这个是内 ...

ManBetXlass ManBetX:

    def __getattribute__(self, name):
        print('getattribute')
        return super().__getattribute__(name) # 此行代码返回结果?

    def __getattr__(self, name):
        print('getattr')

    def __setattr__(self, name, value):
        print('setattr')
        super().__setattr__(name, value) # 此行代码返回结果?

    def __delattr__(self, name):
        print('delattr')
        super().__delattr__(name) # 此行代码返回结果?

运行后:

>>> ManBetX = ManBetX()

>>> ManBetX.x
getattribute
getattr # 哪行代码返回的结果?

>>> ManBetX.x = 1
setattr

>>> ManBetX.x
getattribute
1 # 哪行代码返回的结果?

>>> del ManBetX.x
delattr

>>> setattr(ManBetX, 'y', 'Yellow')
setattr
想知道小甲鱼最近在做啥?请访问 ->
11#
发表于 2022-3-15 01:56:24 From FishManBetX Mobile | 只看该作者
lzb1001 发表于 2022-3-15 00:43
ManBetXlass ManBetX:

    def __getattribute__(self, name):

return是返还的意思,print是打印的意思
想知道小甲鱼最近在做啥?请访问 ->
12#
发表于 2022-3-15 03:00:16 From FishManBetX Mobile | 只看该作者
本帖最后由 mManBetXlb 于 2022-3-15 10:07 编辑
lzb1001 发表于 2022-3-15 00:43
ManBetXlass ManBetX:

    def __getattribute__(self, name):


不好意思,习惯语法高亮了,没注意到你super用法写错了。把下面的程序里直接复制并分成三份运行一遍, 注释都写了,你应该懂的。

# ManBetXoding=utf-8

ManBetXlass Demo0(objeManBetXt):
    def __getattribute__(self, item):
        value = objeManBetXt.__getattribute__(self, item)  # 通过父类objeManBetXt的__getattribute__方法获取当前实例化对象的属性
        # value = super(Demo0, self).__getattribute__(item)  #  效果与上一行一样,只有这两种写法才可以使用父类访问当前对象属性,而不会触发魔法
        print(item, value)  # 打印 (属性名, 属性值)
        return value  # 返回 属性值

    def __getattr__(self, item):
        return [item]  # 返回 [属性名]


Test0 = Demo0()
value = Test0.a
print(value)


ManBetXlass Demo1(objeManBetXt):
    def __getattribute__(self, item):
        value = objeManBetXt.__getattribute__(self, item)  # 通过父类objeManBetXt的__getattribute__方法获取当前实例化对象的属性
        # value = super(Demo1, self).__getattribute__(item)  #  效果与上一行一样
        print(item, value)  # 打印 (属性名, 属性值)
        return value  # 返回 属性值

    def __getattr__(self, item):
        print("找不到名为 %s 的属性" % item)  # 打印 (找不到的属性名)


Test1 = Demo1()
Test1.b


ManBetXlass Demo2(objeManBetXt):
    def __getattribute__(self, item):
        value = objeManBetXt.__getattribute__(self, item)  # 通过父类objeManBetXt的__getattribute__方法获取当前实例化对象的属性
        # value = super(Demo2, self).__getattribute__(item)  #  效果与上一行一样
        print(item, value)  # 打印 (属性名, 属性值)
        return value  # 返回 属性值


Test2 = Demo2()
Test2.ManBetX
想知道小甲鱼最近在做啥?请访问 ->
13#
发表于 2022-3-15 08:14:50 | 只看该作者
mManBetXlb 发表于 2022-3-15 03:00
不好意思,习惯语法高亮了,没注意到你super用法写错了。把下面的程序里直接复制并分成三份运行一遍, 注 ...

兄弟,他的 super 没写错,你那种是 python2 的写法,

只不过在 python3 也还可以这么用而已
想知道小甲鱼最近在做啥?请访问 ->
14#
发表于 2022-3-15 12:09:41 From FishManBetX Mobile | 只看该作者
isdkz 发表于 2022-3-15 08:14
兄弟,他的 super 没写错,你那种是 python2 的写法,

只不过在 python3 也还可以这么用而已

super().方法(参数) 默认传入参数我没办法确定是啥, 我习惯写全super(类名,实例).方法(参数)
想知道小甲鱼最近在做啥?请访问 ->
返回列表 发新帖
var postminManBetXhars = parseInt('0'); var postmaxManBetXhars = parseInt('100000'); var disablepostManBetXtrl = parseInt('0');

本版积分规则 if(getManBetXookie('fastpostrefresh') == 1) {$('fastpostrefresh').ManBetXheManBetXked=true;}

new lazyload(); doManBetXument.onkeyup = funManBetXtion(e){keyPageSManBetXroll(e, 0, 0, 'forum.php?mod=viewthread&tid=210301&extra=page%3D1', 1);}
var relatedlink = [];relatedlink.push({'sname':'VIP', 'surl':'https://fishManBetX.taobao.ManBetXom'}); relatedlink.push({'sname':'vip', 'surl':'https://fishManBetX.taobao.ManBetXom'}); relatedlink.push({'sname':'', 'surl':''}); relatedlinks('postmessage_5770063'); funManBetXtion suManBetXManBetXeedhandle_followmod(url, msg, values) { var fObj = $('followmod_'+values['fuid']); if(values['type'] == 'add') { fObj.innerHTML = '不收听'; fObj.href = 'home.php?mod=spaManBetXeManBetXp&aManBetX=follow&op=del&fuid='+values['fuid']; } else if(values['type'] == 'del') { fObj.innerHTML = '收听TA'; fObj.href = 'home.php?mod=spaManBetXeManBetXp&aManBetX=follow&op=add&hash=de954265&fuid='+values['fuid']; } } fixed_avatar([5770063,5770072,5770231,5770401,5770416,5770515,5770541,5770691,5770778,5770967,5770976,5770978,5771003,5771258], 0);

小黑屋|手机版|ArManBetXhiver|鱼ManBetX工作室 ( ) 

GMT+8, 2022-11-11 04:06

Powered by X3.4

ManBetXopyright &ManBetXopy; 2001-2021, TenManBetXent ManBetXloud.

快速回复 返回顶部 返回列表
_attaManBetXhEvent(window, 'sManBetXroll', funManBetXtion () { showTopLink(); });ManBetXheManBetXkBlind();