Python中的魔法方法(一)

1.python中的__slots__

1.python中的__slots__

介绍:控制python类中的属性的创建

# 这里创建一个类来进行测试
class SlotsTest():
    def __init__(self,x,y):
        self.name = x
        self.age = y
a = SlotsTest("张三",25)
a.city = ‘成都‘
print(a.city)#通过结果可以看到这里如果是正常的创建一个类,是可以通过对象来增加自身的属性
成都
# 现在加入slots这个魔法函数查看效果
class SlotsTest():
    __slots__ = (‘name‘,‘age‘)
    def __init__(self,x,y):
        self.name = x
        self.age = y
a = SlotsTest("张三",25)
print(a.name)
a.city = ‘成都‘
‘‘‘
这里可以看到,通过slots来控制对象的一个属性创建,输出了name,但如果实例本身想要创建一个新的属性的时候就会抛出异常
‘‘‘
张三



---------------------------------------------------------------------------

AttributeError                            Traceback (most recent call last)

<ipython-input-8-7e51ff48629b> in <module>
      7 a = SlotsTest("张三",25)
      8 print(a.name)
----> 9 a.city = ‘成都‘


AttributeError: ‘SlotsTest‘ object has no attribute ‘city‘

2.python中的__del__

class SlotsTest():
    __slots__ = (‘name‘,‘age‘)
    def __init__(self,x,y):
        self.name = x
        self.age = y
    def __del__(self):
        print("该对象已被销毁")
a = SlotsTest("张三",25)
# 通过输出可以看到,创建对象后自动执行了__del__方法销毁了对象
该对象已被销毁

3.python中的 str 和repr

介绍:当我们需要自定义输出对象的信息的时候可以使用它

class SlotsTest():
    def __init__(self,x,y):
        self.name = x
        self.age = y
a = SlotsTest("张三",25)
print(a)
# 可以看到我们如果直接打印这个对象,输出的是一个内存地址的形式
<__main__.SlotsTest object at 0x00000201EF086BA8>
class SlotsTest():
    def __init__(self,x,y):
        self.name = x
        self.age = y
    def __repr__(self):
        return ‘repr自定义对象的输出形式‘
a = SlotsTest("张三",25)
print(a)
自定义对象的输出形式
class SlotsTest():
    def __init__(self,x,y):
        self.name = x
        self.age = y
    def __str__(self):
        return ‘str自定义对象的输出形式‘
a = SlotsTest("张三",25)
print(a)
str自定义对象的输出形式
class SlotsTest():
    def __init__(self,x,y):
        self.name = x
        self.age = y
    def __repr__(self):
        return ‘repr自定义对象的输出形式‘
    def __str__(self):
        return ‘str自定义对象的输出形式‘
a = SlotsTest("张三",25)
print(a)
# 这里可以看到当这两个同时存在的时候str的优先级会比repr高
str自定义对象的输出形式

4.python中的 call

介绍:使对象变成一个可以调用的方法

class SlotsTest():
    def __init__(self,x,y):
        self.name = x
        self.age = y
    def __call__(self):
        print("__call__方法被调用了")
a = SlotsTest("张三",25)
a()
__call__方法被调用了

5.python中的 setitem

class SlotsTest():
    def __init__(self,x,y):
        self.name = x
        self.age = y
    def __setitem__(self,key,value):
        self.__dict__[key] = value
b = SlotsTest("张三",25)
b[‘age‘] = 30
print(b.age)
30
 

相关推荐