python-魔术方法


方法

__call__方法

__call__:可以让类的实例具有类似于函数的行为,进一步模糊了函数和对象之间的概念。
使用方式:对象后面加括号,触发执行。即:对象() 或者 类()()

class Person(object):
    def __call__(self, *args, **kwargs):
        print('call...')

p = Person()  # 将Person()的内存地址赋值给person
p()  # 内存地址() 输出:call...

如上代码所示,调用__call__时,并不需要person.__call__。因为在person=Person()时,就已经将Person()的内存地址赋值给了person,所以后面调用时person本身就代表了那个内存地址,当成函数使用person()

__new__方法

__new__:创建对象,并分配内存

__init__方法

__init__:初始化对象。创建对象后第一个执行的方法。

__str__方法

__str__:打印对象的时候执行的方法。

class MyClass(object):
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return self.name

obj = MyClass('马师傅')
print(obj) #此处输出为__str__的返回值:'马师傅'

__add__方法

__add__:两个对象相加的时候执行的方法。

class MyClass(object):
    def __init__(self, value):
        self.value = value

    def __add__(self, other): # 如果没有这个方法,那最后一行代码执行会报错
        return self.value + other.value

obj1 = MyClass(10.00)
obj2 = MyClass(11.00)
print(obj1 + obj2) # 输出为self.value + other.value的值:21.0

__del__方法

__del__:销毁对象的时候执行的方法。

class MyClass(object):
    def __del__(self): # 销毁对象时执行,可以del obj主动执行,也可以在垃圾回收时自动执行
        # 销毁对象   # 析构
        print('del is running ...') # 此处可以做一些销毁对象前需要做的事情

obj1 = MyClass()
obj2 = MyClass()
del obj1 # 主动执行__del__方法
del obj2

__getitem__方法

__getitem__:使用[ ]操作对象的时候调用此方法。
换言之,一个对象没有__getitem__方法就不能用[ ]操作。

class MyClass(object):
    def __init__(self):
        self.items = ['a', 'b', 'c']

    def __getitem__(self, i):
        return self.items[i]

obj = MyClass()
print(obj[0])  # a
print(obj[1])  # b
print(obj[2])  # c
print(hasattr(tuple, '__getitem__'))  # True
print(hasattr(1, '__getitem__'))  # False
print(hasattr(dict, '__getitem__'))  # True

__getattr__方法

__getattr__:当获得对象的属性,而对象无此属性时执行。
object类没有这个方法,如果不定义此方法,没有属性时会直接抛出异常。

class MyClass(object):
    def __init__(self, value):
        self.value = value

    def __getattr__(self, item):
        # __getattr__ 当获得对象的属性,而对象无此属性时执行
        return '没有此属性'

obj = MyClass(1)
print(obj.value)
print(obj.name) # 没有此属性

__setattr__方法

__setattr__:设置属性时执行的方法

class MyClass(object):
    def __init__(self, name):
        self.name = name

    def __setattr__(self, key, value):
        print("setattr is running ....")
        super().__setattr__(key, value)

obj = MyClass('zhang') # setattr is running ....
obj.name = 'li' # setattr is running ....

__delattr__方法

__delattr__:删除属性时执行的方法

class MyClass(object):
    def __init__(self, name):
        self.name = name

    def __delattr__(self, item):
        print("delattr is running ...")
        super().__delattr__(item)

obj = MyClass('zhang')
del obj.name # delattr is running ...
print(obj.name) # 属性已被删除,这里会报错

属性

__bases__属性

__bases__: 就是一个元组,里面是继承的类

class A(object):
    pass

class B(object):
    pass

class MyClass(A, B):
    pass

print(A.__bases__) # (<class 'object'>,)
print(MyClass.__bases__) # (<class '__main__.A'>, <class '__main__.B'>)

__dict__属性

__dict__:字典存放的是当前调用者的所有属性

class MyClass(object):  # MyClass 是类 , 类 其实就是 定义如何创建对象的一段代码
    a = 0  # 类变量 (归属于类)

    def __init__(self, name, age):
        temp = 1  # 局部变量
        self.name = name  # self  是对象
        self.age = age  # name ,age  实例变量(归属于对象)

    def get_name(self):
        return self.name

obj = MyClass('Aaron', 18)
print(MyClass.__dict__) 
'''
{'__module__': '__main__', 
'a': 0, 
'__init__': <function MyClass.__init__ at 0x00000170ECA28168>, 
'get_name': <function MyClass.get_name at 0x00000170ECA2C5E8>, 
'__dict__': <attribute '__dict__' of 'MyClass' objects>, 
'__weakref__': <attribute '__weakref__' of 'MyClass' objects>, 
'__doc__': None}
'''
print(obj.__dict__) # {'name': 'Aaron', 'age': 18}

__slots__属性

__slots__:覆盖 __dict__中的属性,限制对象的属性只能有这些。可以节省内存。

class MyClass(object):
    __slots__ = ['age','name']

    def __init__(self, name,x):# __slots__中没有x,则此处给x赋值会报错
        self.name = name

obj = MyClass('aaaa',1)
obj2 = MyClass('bbb',1)
print(obj.__slots__)
print(MyClass.__dict__)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值