• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

类的内置方法(魔法方法)

python 搞java代码 3年前 (2022-05-21) 23次浏览 已收录 0个评论

类的内置方法(魔法方法)

  凡是在类内部定义,以__开头__结尾的方法,都是类的内置方法,也称之为魔法方法

  注意:类的内置方法,会在某种条件满足下自动触发

 

常用内置方法:

  1) __init__:在调用类时自动触发,通过object产生的空对象自动调用__init__()

 

  2) __new__:在__init__触发前自动触发,调用该类时,内部会通过__new__产生一个新的对象

 

  3) __getattr__:在 “对象.属性” 获取属性时,若 “没有该属性” 时触发

 

  4) __getattribute__:在 “对象.属性” 获取属性时,”无论有没有该属性” 都会触发,默认return一个None

 

  5) __setattr__:当 “对象.属性 = 属性值” ,”添加或修改属性” 时触发

 

  6) __call__:在调用对象 “对象 + ()” 时触发

 

  7) __str__:在 “打印对象” 时触发

 

  8)__getitem__:在对象通过 “对象[key]” 获取属性时触发

 

  9) __setitem__:在对象通过 “对象[key]=value值” 获取属性时触发

 

注意:1、python3中的类默认都是新式类,默认继承object类

   2、魔方方法与在类中的位置无关

 

 

1、__init__

  在调用类时自动触发,通过object类产生的空对象自动调用__init__()

 

<span>class</span> Demo(object):    <span>#</span><span> python3中类默认继承object类(因此python3中的类都是新式类,这里继承的object类可写可不写)</span>
    <span>#</span><span> __init__:在调用类时自动触发</span>
    <span>def</span> <span>__init__</span><span>(self):
        </span><span>print</span>(<span>"</span><span>此处是__init__方法的执行..</span><span>"</span><span>)

<br>Demo()</span>

www#gaodaima.com来源gao@!dai!ma.com搞$$代^@码!网搞代码

  执行结果:

此处是__init__方法的执行..

 

 

2、__new__

  在__init__触发前自动触发,调用该类时,内部会通过__new__产生一个新的对象

 

<span>class</span> Demo(object):    <span>#</span><span> 这里的object父类可写可不写</span>
    <span>def</span> <span>__init__</span><span>(self):
        </span><span>print</span>(<span>"</span><span>此处是__init__方法的执行..</span><span>"</span><span>)

    </span><span>#</span><span> object类中有__new__方法会默认创建一个新的空对象,但是此处被重写,不会创建一个新的空对象</span>
    <span>def</span> <span>__new__</span>(cls, *args, **<span>kwargs):
        </span><span>print</span>(<span>"</span><span>此处是__new__方法的执行..</span><span>"</span><span>)

        </span><span>#</span><span> python内部通过object类调用内部的__new__方法实现产生一个新的空对象(内存地址)</span>
        <span>#</span><span> return object.__new__(cls, *args, **kwargs)</span><br><br><span>
Demo()    </span><strong><span>#</span><span> __new__方法被重写,无法创建新的空对象,所以__init__方法不执行</span></strong>

  执行结果:

此处是__new__方法的执行..

 

 

3、__getattr__

  在 “对象.属性” 获取属性时,若 “没有该属性” 时触发

 

<span>class</span> Demo():
    <span>def</span> <span>__new__</span>(cls, *args, **<span>kwargs):
        </span><span>print</span>(<span>"</span><span>此处是__new__方法的执行..</span><span>"</span><span>)
        </span><span>return</span> object.<span>__new__</span>(cls, *args, **<span>kwargs)

    </span><span>def</span> <span>__init__</span><span>(self):
        </span><span>print</span>(<span>"</span><span>此处是__init__方法的执行..</span><span>"</span><span>)
    
    </span><span>#</span><span> __getattr__:在 "对象.属性" 获取属性时,若 "没有该属性" 时触发</span>
    <span>def</span> <span>__getattr__</span><span>(self, item):
        </span><span>print</span>(<span>"</span><span>此处是__getattr__方法的执行..</span><span>"</span><span>)
        </span><span>print</span>(item)    <span>#</span><span> item在此处是属性的名字</span>
        <span>return</span> <span>"</span><span>Tom is very cute...</span><span>"</span><span>


demo_obj </span>=<span> Demo()
</span><span>print</span>(demo_obj.x, <span>"</span><span>  <--- 没有x属性触发__getattr__方法return的值</span><span>"</span>)    <span>#</span><span> 没有x属性</span>
demo_obj.y = 20    <span>#</span><span> 添加y属性</span>
<span>print</span>(demo_obj.y, <span>"</span><span>                   <--- 有y属性不触发__getattr__方法return的值</span><span>"</span>)    <span>#</span><span> 有y属性</span>

  执行结果:

<span>执行结果:
此处是__new__方法的执行..
此处是__init__方法的执行..
此处是__getattr__方法的执行..
x
Tom </span><span>is</span> very cute...   <---<span> 没有x属性触发__getattr__方法return的值
</span>20                    <--- 有y属性不触发__getattr__方法return的值

 

 

4、__getattribute__

  在 “对象.属性” 获取属性时,”无论有没有该属性” 都会触发,默认return一个None

  注意:如果__getattr__方法与__getattribute__方法同时存在类的内部,只会触发__getattribute__方法

 

<span>class</span> Demo():
    <span>def</span> <span>__new__</span>(cls, *args, **<span>kwargs):
        </span><span>print</span>(<span>"</span><span>此处是__new__方法的执行..</span><span>"</span><span>)
        </span><span>return</span> object.<span>__new__</span>(cls, *args, **<span>kwargs)

    </span><span>def</span> <span>__init__</span><span>(self):
        </span><span>print</span>(<span>"</span><span>此处是__init__方法的执行..</span><span>"</span><span>)

    </span><span>def</span> <span>__getattr__</span><span>(self, item):
        </span><span>print</span>(<span>"</span><span>此处是__getattr__方法的执行..</span><span>"</span><span>)
        </span><span>print</span><span>(item)
        </span><span>return</span> <span>"</span><span>Tom is very cute...</span><span>"</span>

<span>    # __getattribute__:在 "对象.属性" 获取属性时,"无论有没有该属性" 都会触发</span>
    <span>def</span> <span>__getattribute__</span><span>(self, item):
        </span><span>print</span>(<span>"</span><span>此处是__getattribute__方法的执行..</span><span>"</span><span>)
        </span><span>print</span>(item)    <span>#</span><span> item在此处是属性的名字</span>
<span>

demo_obj </span>=<span> Demo()
</span><span>print</span>(demo_obj.x, <span>"</span><span>  <--- 没有x属性触发__getattribute__方法return的值(默认为None)</span><span>"</span>)    <span>#</span><span> 没有x属性</span>
demo_obj.y = 20    <span>#</span><span> 添加y属性</span>
<span>print</span>(demo_obj.y, <span>"</span><span>  <--- 有y属性触发__getattribute__方法return的值(默认为None)</span><span>"</span>)    <span>#</span><span> 有x属性</span><span>
#</span><span> 如果__getattr__与__getattribute__同时存在类的内部,只会触发__getattribute__</span>

  执行结果:

<span>此处是__new__方法的执行..
此处是__init__方法的执行..
此处是__getattribute__方法的执行..
x
None   </span><---<span> 没有x属性触发__getattribute__方法return的值(默认为None)
此处是__getattribute__方法的执行..
y
None   </span><--- 有y属性触发__getattribute__方法return的值(默认为None)

 

 

5、__setattr__

  当 “对象.属性 = 属性值” ,”添加或修改属性” 时触发

 

<span>class</span><span> Demo():
    </span><span>def</span> <span>__new__</span>(cls, *args, **<span>kwargs):
        </span><span>print</span>(<span>"</span><span>此处是__new__方法的执行..</span><span>"</span><span>)
        </span><span>return</span> object.<span>__new__</span>(cls, *args, **<span>kwargs)

    </span><span>def</span> <span>__init__</span><span>(self):
        </span><span>print</span>(<span>"</span><span>此处是__init__方法的执行..</span><span>"</span><span>)
</span>
    <span>#</span><span> __setattr__:当 "对象.属性 = 属性值" ,"添加或修改属性" 时触发</span>
    <span>def</span> <span>__setattr__</span>(self, key, value):    <span>#</span><span> key是 "对象的属性名", value是 "属性值"</span>
        <span>print</span>(<span>"</span><span>此处是__setattr__方法的执行..</span><span>"</span><span>)
        </span><span>print</span><span>(key, value)
        </span><span>#</span><span> self.key = value    # 不能这样设置,会出现无限递归</span>
        <span>#</span><span> 此处是对 "对象的名称空间(字典)" 进行操作</span>
        self.<span>__dict__</span>[key] =<span> value


demo_obj </span>=<span> Demo()
</span><span>#</span><span> 原来设置属性时,会自动触发父类object中的__setattr__,内部为对象添加z属性,值为30</span>
demo_obj.z = 30<span>
demo_obj.z </span>= 40
<span>print</span>(demo_obj.<span>__dict__</span>)

  执行结果:

<span>此处是__new__方法的执行..
此处是__init__方法的执行..
此处是__setattr__方法的执行..
z </span>30<span>
此处是__setattr__方法的执行..
z </span>40<span>
{</span><span>"</span><span>z</span><span>"</span>: 40}

 

 

6、__call__

  在调用对象 “对象 + ()” 时触发

 

<span>class</span><span> Demo(object):
    </span><span>def</span> <span>__new__</span>(cls, *args, **<span>kwargs):
        </span><span>print</span>(<span>"</span><span>此处是__new__方法的执行..</span><span>"</span><span>)
        </span><span>return</span> object.<span>__new__</span>(cls, *args, **<span>kwargs)

    </span><span>def</span> <span>__init__</span><span>(self):
        </span><span>print</span>(<span>"</span><span>此处是__init__方法的执行..</span><span>"</span><span>)

    </span><span>#</span><span> __call__:在调用对象 "对象 + ()" 时触发</span>
    <span>def</span> <span>__call__</span>(self, *args, **<span>kwargs):
        </span><span>print</span>(<span>"</span><span>此处是__call__方法的执行..</span><span>"</span><span>)

        </span><span>#</span><span> 调用对象时返回的值</span>
        <span>return</span> [1, 2, 3, 4, 5<span>]
<br>
demo_obj </span>=<span> Demo()
res </span>=<span> demo_obj()
</span><span>print</span>(res)

  执行结果:

<span>此处是__new__方法的执行..
此处是__init__方法的执行..
此处是__call__方法的执行..
[</span>1, 2, 3, 4, 5]

 

 

7、__str__

  在 “打印对象” 时触发

  注意:__str__方法必须要有一个 “字符串” 返回值

 

<span>class</span><span> Demo(object):
    </span><span>def</span> <span>__new__</span>(cls, *args, **<span>kwargs):
        </span><span>print</span>(<span>"</span><span>此处是__new__方法的执行..</span><span>"</span><span>)
        </span><span>return</span> object.<span>__new__</span>(cls, *args, **<span>kwargs)

    </span><span>def</span> <span>__init__</span><span>(self):
        </span><span>print</span>(<span>"</span><span>此处是__init__方法的执行..</span><span>"</span><span>)

    </span><span>#</span><span> __str__:在打印对象时触发</span>
    <span>def</span> <span>__str__</span><span>(self):
        </span><span>print</span>(<span>"</span><span>此处是__str__方法的执行..</span><span>"</span><span>)
        </span><span>#</span><span> __str__方法必须要有一个 "字符串" 返回值</span>
        <span>return "111"</span><span>


demo_obj </span>=<span> Demo()
</span><span>print</span>(demo_obj)

  执行结果:

<span>此处是__new__方法的执行..
此处是__init__方法的执行..
此处是__str__方法的执行..
</span>111

 

 

8、__getitem__

  在对象通过 “对象[key]” 获取属性时触发

 

<span>class</span><span> Demo(object):
    </span><span>def</span> <span>__new__</span>(cls, *args, **<span>kwargs):
        </span><span>print</span>(<span>"</span><span>此处是__new__方法的执行..</span><span>"</span><span>)
        </span><span>return</span> object.<span>__new__</span>(cls, *args, **<span>kwargs)

    </span><span>def</span> <span>__init__</span><span>(self):
        </span><span>print</span>(<span>"</span><span>此处是__init__方法的执行..</span><span>"</span><span>)

    </span><span>#</span><span> __getitem__:在对象通过 "对象[key]" 获取属性时触发</span>
    <span>def</span> <span>__getitem__</span><span>(self, item):
        </span><span>print</span>(<span>"</span><span>此处是__getitem__方法的执行..</span><span>"</span><span>)
        </span><span>print</span>(item)    <span>#</span><span> item在此处是属性的名字</span>

        <span>return</span> self.<span>__dict__</span>[item]    <span>#</span><span> 返回的是对象内存空间中属性的值</span>
<span>

demo_obj </span>=<span> Demo()
demo_obj.b </span>= 50
<span>print</span>(demo_obj[<span>"</span><span>b</span><span>"</span>])

  执行结果:

<span>此处是__new__方法的执行..
此处是__init__方法的执行..
此处是__getitem__方法的执行..
b
</span>50

 

 

9、__setitem__

  在对象通过 “对象[key]=value值” 获取属性时触发

 

<span>class</span><span> Demo(object):
    </span><span>def</span> <span>__new__</span>(cls, *args, **<span>kwargs):
        </span><span>print</span>(<span>"</span><span>此处是__new__方法的执行..</span><span>"</span><span>)
        </span><span>return</span> object.<span>__new__</span>(cls, *args, **<span>kwargs)

    </span><span>def</span> <span>__init__</span><span>(self):
        </span><span>print</span>(<span>"</span><span>此处是__init__方法的执行..</span><span>"</span><span>)

    </span><span>def</span> <span>__getitem__</span><span>(self, item):
        </span><span>print</span>(<span>"</span><span>此处是__getitem__方法的执行..</span><span>"</span><span>)
        </span><span>return</span> self.<span>__dict__</span><span>[item]

    </span><span>#</span><span> __setitem__:在对象通过 "对象[key]=value值" 获取属性时触发</span>
    <span>def</span> <span>__setitem__</span><span>(self, key, value):
        </span><span>print</span>(<span>"</span><span>此处是__setitem__方法的执行..</span><span>"</span><span>)
        </span><span>#</span><span> print(key)    # key在此处是属性的名字</span>
        <span>#</span><span> print(value)    # value是属性值</span>
<span>
        self.</span><span>__dict__</span>[key] = value    <span>#</span><span> 将key:value添加到对象的名称空间中</span><br><br><span>
demo_obj </span>=<span> Demo()
demo_obj[</span><span>"</span><span>c</span><span>"</span>] = 100    <span>#</span><span> 存属性</span>
<span>print</span>(demo_obj[<span>"</span><span>c</span><span>"</span>])    <span>#</span><span> 取属性值</span>

  执行结果:

<span>此处是__new__方法的执行..
此处是__init__方法的执行..
此处是__setitem__方法的执行..
此处是__getitem__方法的执行..
</span>100

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:类的内置方法(魔法方法)

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址