Python 中的特殊双下划线方法

python类内部部分双下划线特殊方法

__setattr__, __getattr__, __delattr__, hasattr __getattribute__ __getitem__(),__setitem__(), __delitem__()

主程序如下:
class Foo:
def _inif(self,pname):
 self.pname = pname
def func():
 print(‘i‘m func‘)
def __getattr__(self, item):
  print(‘提示:属性[%s]不存在。‘%item)
def __setattr__(selft, key, value):
  print(‘提示:属性赋值操作:[%s=%s]‘%(key,value))
  self.__dict__[key]=value
  #self.key=value
  #无法使用,会无限递归,这就是调用本身__setattr__
def __delattr__(self, item):
  print(‘提示:删除属性操作:删除[%s]‘%item)
  if item in self.__dict__:
    self.__dict__.pop(item)
  #del self.item #无限递归了
  #无法使用,会无限递归,这就是调用本身__delattr__

1、得到属性值。__getattr__方法的运行流程,以及getattr的运行流程。当不存在属性名/方法名时,查找__getattr__()方法是否存在,存在即执行它。不存在再查看有没有默认参数,有则返回,没有则报错。

2、判断属性/方法名是否存在。__getattr__方法的运行流程,以及hasattr的运行流程

3、给属性赋值。setattr(对象名, 属性名字符串,属性值),例如:setattr(f1,‘y‘,‘ccc‘)。

当__setattr__方法存在时,执行它内部的程序,必须执行:self.__dict__[key]=value,要不然不会进行赋值。(该方法默认返回值是None,一般不会使用)

4、删除属性。delattr(对象名, 属性名字符串),例如:delattr(f1,‘y‘)。

当__delattr__方法存在时,执行它内部的程序,必须执行:

if item in self.__dict__:#要进行判断,如果键不存在,pop会出错。

self.__dict__.pop(item)

要不然不会进行删除。(该方法默认返回值是None,一般不会使用)

5.__getattribute__方法,只要调用属性就会进行__getattribute__方法,只有遇到raise AttributeError()(必须是AttributeError异常)才会执行__getattr__

class Foo:
    def __init__(self, guestname, guestmobile):
        self.guestname = guestname
        self.guestmobile= guestmobile
    def __getattribute__(self, item):
        print(‘获取属性值操作 %s‘%item)
        if item != ‘guestname‘:
            raise AttributeError()
    def __getattr__(self, item):
        print(‘找不到属性 %s‘%item)

f = Foo(‘小王‘,‘13945784807‘)
f.guestname
f.guestage

执行结果:

获取属性值操作 guestname

获取属性值操作 guestage

找不到属性 guestage

6.操作对象的属性/方法名时,像字典一样操作__getitem__(),__setitem__(), __delitem__(),具体操作字典方法要在其中自己写。以下代码只列了setitem,其余的都操作self.__dict[xx]=xx就可以。

class Foo:
pass
f =Foo()
f[‘a‘]=12
执行结果:
TypeError: ‘Foo‘ object does not support item assignment
class Foo:
     def __setitem__(self, key, value):
        print(‘run setitem‘)
        self.__dict__[key]=value

f =Foo()
f[‘a‘]=12
print(f.a)

执行结果:
run setitem
12

口诀:

对象/类的 点的操作,都和attr相关

对象/类的 中括号的操作,都和item相关

7.__str__和 __repr__,对象返回值的方法,他们内部必须以return返回,必须返回str类型的值。

a.当编译器提示性返回时,就调用__repr__()

b.当print或者str(对象实例名),就调用__str__()

>>> class Foo:
...     def __str__(self):
...             return ‘ggg‘
...     def __repr__(self):
...             return ‘xxx‘
...
>>> f = Foo()
>>> f
xxx
>>> class Foo:
...     def __str__(self):
...             return ‘ooo‘
...
>>> f=Foo()
>>> f
<__main__.Foo object at 0x000001AB94DC9C18>
>>> print(f)
ooo
>>>

口诀:print()方法变量方法顺序,找str,再找repr

‘‘‘
str函数或者print函数--->obj.__str__()
repr或者交互式解释器--->obj.__repr__()
如果__str__没有被定义,那么就会使用__repr__来代替输出
注意:这俩方法的返回值必须是字符串,否则抛出异常
‘‘‘

原文地址:https://www.cnblogs.com/caisong/p/10187122.html

时间: 2024-07-30 01:25:16

Python 中的特殊双下划线方法的相关文章

Python(88)_双下划线方法

1.双下划线方法 #-*-coding:utf-8-*- import os import time ''' 迭代器 ''' print(dir([])) # 告诉我列表拥有的所有方法 print(dir({})) print(dir('')) ''' 求共有方法,集合求交集 ''' ret = set(dir([]))&set(dir({}))&set(dir(''))&set(dir(range(10))) print(ret) # __iter__ print([1].__a

python基本知识(八):定制类,双下划线方法

'''定制类: 1. 双下划线属性__attr__ 2. 元类metaclass''' # 综述 '''iterable/iterator:1. __iter__(): return iterable_obj 1) 实现了该方法的对象叫iterable 2) iter(obj)会调用该方法, 生成一个迭代器iterator 2. __next__(): 指明迭代器怎么返回值 1) next(iterator)会返回一个值, 直到所有的值都返回了报错StopIteration 2) for.. i

面向对象双下划线方法

1|0阅读目录 isinstance和issubclass 反射 setattr delattr getattr hasattr __str__和__repr__ item系列 __getitem__ __setitem__ __delitem__ __del__ __new__ __call__ with和__enter__,__exit__ __len__ __hash__ __eq__ 回到顶部 2|0isinstance和issubclass isinstance(obj,cls)检查是

Python双下划线方法解释

__init__ 类实例创建之后调用, 对当前对象的实例的一些初始化, 没有返回值 __name__ 标识模块的名字的一个系统变量 __call__ 是否可被调用 __main__ 主模块模块名(是否当前模块或导入模块) __new__ 创建类实例的方法, 创建对象时调用, 返回当前对象的一个实例 __init__.py 主要控制包的导入行为 __file__ 表示文件本身,输出的是一个绝对路径 sys.path.append(os.path.dirname(os.path.dirname(os

67 orm13查询语句,外键查询,多对多查询 单表查询双下划线方法

主要内容:https://www.cnblogs.com/maple-shaw/articles/9403501.html 注意:  如果想要文件中运行整个django项目: 需要在文件中写入: import os if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_operate.settings") import django djan

python中的下划线及双下划线

一.Python 用下划线作为变量前缀和后缀指定特殊变量 1. 单下划线开头: _xxx:弱“内部使用”标识,如:”from Module import *”,将不导入所有以下划线开头的对象,包括包.模块.成员 2. 双下划线开头: __xxx:模块内的私有成员,外部无法直接调用. 即:私有类型的变量.只能是允许这个类本身进行访问了.连子类也不可以 3. 双下划线开头和结尾: __xxx__ :系统定义名字, 用户无法控制的命名空间中的“魔术”对象或属性, 如: __name__.__doc__

python中的单下划线和双下划线意义和作用

Python中并没有真正意义上的“私有”,类的属性的的可见性取决于属性的名字(这里的属性包括了函数).例如,以单下划线开头的属性(例如_spam),应被当成API中非公有的部分(但是注意,它们仍然可以被访问),一般是具体实现细节的部分.单下划线常用来实现模块级私有化,当我们使用“from mymodule import *”来加载模块的时候,不会加载以单下划线开头的模块属性. 而以双下划线开头并最多以一个下划线结尾的属性(例如___spam),将会被替换成_classname__spam这样的形

Python 中的函数的双下划线“__”

Python中最常见的是类中的带有双下滑线的函数是 __init__()最开始只是知道 有初始化的作用,这里从原理上总结一下. 在Python中,由这些名字组成的集合所包含的方法称为特殊方法.如果对象实现了这些方法中的某一个,那么这个方法会在特殊情况下(确切的说是根据名字)被Python调用.而几乎没有直接调用它们的必要. 一.首先讨论__init__(),标准来说它是类的构造方法.当一个对象被创建后,会立即调用构造方法. class Test: def __init__(self): self

python中的单下划线,双下划线以及两端双下划线

1.在python的解释器中,_是上一条语句的执行结果,最早是CPython施行,到现在其他类型的解释器也在使用2.上面的语句执行结果是在屏幕上打印十行hello world,我们并不需要0-9这些数字,所以没必要给他一个变量名'_'3.单下划线:单下划线的变量是一种程序员之间美丽的约定——只要是这种变量就不要随便在类外部去访问它!!! 但是如果我们在导入模块时来看这个单下划线开头的变量,那就不一样了,在这里这种特殊名字的变量就变成了类似一种某个模块的“私有”变量,因为我们在使用from 模块名