首页 > 其他分享 >魔法方法、反射

魔法方法、反射

时间:2023-03-22 14:33:12浏览次数:37  
标签:__ 反射 name self 魔法 print 方法 def

常用魔法方法

构造方法

init方法

  • 类名加括号产生一个空对象的时候自动触发,给对象添加独有数据
class Test:

    def __init__(self, name, age):
        self.name = name
        self.age = age
        print("名字:" + self.name)
        print("年龄:" + self.age)


if __name__ == '__main__':
    a = Test("小李", "18")
# -------输出结果---------
名字:小李
年龄:18

del方法

  • 对象在被删除的时候自动触发(主动删除)当所有代码执行完成结束,整个名称空间都要删除(被动删除)
class Test:

    def __init__(self):
        print("初始化对象")

    def __del__(self):
        print("对象被删除了")


if __name__ == '__main__':
    a = Test()
    print("end")
# -------输出结果---------
初始化对象
对象被删除了

new方法

  • __new__ 是对象实例化时第一个调用的方法,它只取下 cls 参数,并把其他参数传给 __init__ __new__很少使用,但是也有它适合的场景,尤其是当类继承自一个像元组或者字符串这样不经常改变的类型的时候
class Singleton:
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, "_instance"):
            print("这个类没有创建")
            cls._instance = super().__new__(cls, *args, **kwargs)  # 使用父类的方法来创建类
        print("这个类已经创建")
        return cls._instance

s = Singleton()
s2 = Singleton()  # s 和 s2 是同一个类,其共用一个内存地址

类的表示

str方法

  • 对象被执行打印操作的时候自动触发,返回值必须是字符串类型
class Test:

    def __init__(self):
        pass

    def __str__(self):
        return "test_name"


if __name__ == '__main__':
    a = Test()
    print(a)
# -------输出结果---------
test_name

repr方法

  • 返回值是str类型的,当我们直接在shell中输入对象名并按下回车,就会自动调用该方法,他也有和__str__一样的功能,但如果两者你都重写了,在使用print时,__str__的优先级高,__repr__是给机器看的,__str__是给人看的,举个例子
>>> class A:
    def __str__(self):
        return '我真帅'
    def __repr__(self):
        return '我是世界第一帅'

>>> a = A()
>>> a
我是世界第一帅
>>> print(a)
我真帅

上下文管理器

enter方法

  • 当对象被当做with上下文管理操作的开始自动触发,该方法返回什么,as后面的变量名就得到什么

exit方法

  • 对象被with语法执行完毕后自动触发,第一个参数代表追溯信息
class Closer:
    '''一个上下文管理器,可以在with语句中
    使用close()自动关闭对象'''

    def __init__(self, obj):
        self.obj = obj

    def __enter__(self, obj):
        return self.obj # 绑定到目标

    def __exit__(self, exception_type, exception_value, traceback):
    	try:
            self.obj.close()
        except AttributeError: # obj不是可关闭的
            print 'Not closable.'
            return True # 成功地处理了异常

访问控制

getattr方法

  • 对象点不存在的名字自动触发,该方法返回什么,对象获取不存在的属性名就会得到什么,不返回默认为None,形参item就是对象想要获取的不存在的属性名

setattr方法

  • 给对象添加或修改数据时会自动触发对象.属性=属性名一定要小心使用__setattr__,这个列表最后的例子中会有所展示

delattr方法

  • 这个魔法方法和__setattr__几乎相同,只不过它是用于处理删除属性时的行为自动触发。和 __setattr__ 一样,使用它时也需要多加小心,防止产生无限递归(在__delattr__的实现中调用 del self.name 会导致无限递归)
class AccessCounter(object):
    ''' 一个包含了一个值并且实现了访问计数器的类
    每次值的变化都会导致计数器自增'''

	def __init__(self, val):
        super(AccessCounter, self).__setattr__('counter', 0)
        super(AccessCounter, self).__setattr__('value', val)

    def __setattr__(self, name, value):
        if name == 'value':
            super(AccessCounter, self).__setattr_('counter', self.counter + 1)
        # 使计数器自增变成不可避免
        # 如果你想阻止其他属性的赋值行为
        # 产生 AttributeError(name) 就可以了
        super(AccessCounter, self).__setattr__(name, value)

    def __delattr__(self, name):
        if name == 'value':
            super(AccessCounter, self).__setattr__('counter', self.counter + 1)
            super(AccessCounter, self).__delattr__(name)

容器内部魔法方法

getitem方法

  • 定义对容器中某一项使用 self[key] 的方式进行读取操作时的行为。这也是可变和不可变容器类型都需要实现的一个方法。它应该在键的类型错误式产生 TypeError 异常,同时在没有与键值相匹配的内容时产生 KeyError 异常

setitem方法

  • 定义对容器中某一项使用 self[key] 的方式进行赋值操作时的行为。它是可变容器类型必须实现的一个方法,同样应该在合适的时候产生 KeyErrorTypeError 异常

可调用对象

call方法

  • 允许类的一个实例像函数那样被调用。本质上这代表了 x()x.__call__() 是相同的。注意 __call__ 可以有多个参数,这代表你可以像定义其他任何函数一样,定义 __call__ ,喜欢用多少参数就用多少

魔法方法大全

魔法方法 什么时候被调用 解释
__new__(cls [,...]) instance = MyClass(arg1, arg2) __new__在实例创建时调用
__init__(self [,...]) instance = MyClass(arg1,arg2) __init__在实例创建时调用
__cmp__(self) self == other, self > other 等 进行比较时调用
__pos__(self) +self 一元加法符号
__neg__(self) -self 一元减法符号
__invert__(self) ~self 按位取反
__index__(self) x[self] 当对象用于索引时
__nonzero__(self) bool(self) 对象的布尔值
__getattr__(self, name) self.name #name不存在 访问不存在的属性
__setattr__(self, name) self.name = val 给属性赋值
__delattr_(self, name) del self.name 删除属性
__getattribute__(self,name) self.name 访问任意属性
__getitem__(self, key) self[key] 使用索引访问某个元素
__setitem__(self, key) self[key] = val 使用索引给某个元素赋值
__delitem__(self, key) del self[key] 使用索引删除某个对象
__iter__(self) for x in self 迭代
__contains__(self, value) value in self, value not in self 使用in进行成员测试
__call__(self [,...]) self(args) “调用”一个实例
__enter__(self) with self as x: with声明的上下文管理器
__exit__(self, exc, val, trace) with self as x: with声明的上下文管理器
__getstate__(self) pickle.dump(pkl_file, self) Pickle
__setstate__(self) data = pickle.load(pkl_file) Pickle

标签:__,反射,name,self,魔法,print,方法,def
From: https://www.cnblogs.com/oiqwyig/p/17243629.html

相关文章

  • C++调试方法总结(VS Code & VS & dbg)
    一、VSCodeC++程序调试1.1配置C++运行环境安装C/C++插件后打开C++设置界面:选择编译器、c和c++标准,以及inteliSenseMode之后会在当前.vscode目录下生成一个c_cpp_......
  • JavaScript对象中常见的方法和不常见的方法
    常见的方法:Object.assign()-将一个或多个对象的属性复制到目标对象。Object.keys()-返回对象中所有属性的名称。Object.values()-返回对象中所有属性的值。Obje......
  • 方法的重写
    重写:需要有继承关系,子类重新父类的方法1.方法名必须相同2.参数列表必须相同3.修饰符:范围可以扩大但不可以缩小 public>Protected>Default>private......
  • 26.方法重写
    方法重写这一篇的代码内容拆分为三个java文件,注意辨别publicclassApplication{publicstaticvoidmain(String[]args){////静态方法//......
  • 解决Kafka总是丢消息的方法和原理
    注:本文转自:https://www.toutiao.com/article/7210953985497678347/?log_from=f0ecce317abb8_1679450040551引入MQ消息中间件最直接的目的:系统解耦以及流量控制(削峰填谷)......
  • adobe应用安装提示【错误代码1】解决方法~
    日常安装adobe应用难免出现一些异常问题,今天分享的adobe应用安装提示【错误代码1】解决方法,来简单高效的解决您出现该异常时的困扰!在您收到错误1并且安装失败时候,该如何处......
  • Android 上网流量监控方法
    一.下提供两种方法获取上网流量相关信息。利用TrafficStats(2.2版本以上)TrafficStats类存在好几个查看流量的方法,具体说明参照SDK。getMobileRxByte......
  • 前端设计模式——模板方法模式
    模板方法模式(TemplateMethodPattern):定义一个行为的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个行为的结构即可重定义该行为的某些特定步骤。这些步......
  • 学习方法
    看马林老师讲关于学习方法的视频,做了一个思维导图。B站链接:点这 ......
  • 读取文件的三个方法
    packagemainimport( "bufio" "fmt" "io" "io/ioutil" "os")funcdome01(){ file,err:=os.Open("E:\\GOGO\\GOE\\dome01\\main.go") iferr!=nil{ ......