0x00:魔术方法

Python 里有一种方法,叫做魔法方法。Python 的类里提供的,两个下划线开始,两个下划线结束的方法,就是魔法方法,魔法方法在恰当的时候就会被激活,自动执行。 魔法方法的两个特点:

  • 两侧各有两个下划线;
  • “咒语”名字已经由 Python 官方定义好,我们不能乱写。

  • 0x01:init方法

init()方法,在创建一个对象时默认被调用,不需要手动调用。在开发中,如果希望在创建对象的同时,就设置对象的属性,可以对init方法进行改造。

  1. class Cat:
  2. """这是一个猫类"""
  3. def __init__(self,name): # 重写了 __init__ 魔法方法
  4. self.name = name
  5. def eat(self):
  6. return "%s爱吃鱼"%self.name
  7. def drink(self):
  8. return '%s爱喝水'%self.name
  9. """
  10. tom = Cat()
  11. TypeError: __init__() missing 1 required positional argument: 'name'
  12. 这种写法在运行时会直接报错!因为 __init__ 方法里要求在创建对象时,必须要传递 name 属性,如果不传入会直接报错!
  13. """
  14. tom = Cat("Tom") # 创建对象时,必须要指定name属性的值
  15. tom.eat() # tom爱吃鱼

注意:

  1. init()方法在创建对象时,会默认被调用,不需要手动的调用这个方法。
  2. init()方法里的self参数,在创建对象时不需要传递参数,python解释器会把创建好的对象引用直接赋值给self
  3. 在类的内部,可以使用self来使用属性和调用方法;在类的外部,需要使用对象名来使用属性和调用方法。
  4. 如果有多个对象,每个对象的属性是各自保存的,都有各自独立的地址。
  5. 方法是所有对象共享的,只占用一份内存空间,方法被调用时会通过self来判断是哪个对象调用了实例

0x02:del方法

创建对象后,python解释器默认调用init()方法;
而当删除对象时,python解释器也会默认调用一个方法,这个方法为del()方法。

  1. class Student:
  2. def __init__(self,name,score):
  3. print('__init__方法被调用了')
  4. self.name = name
  5. self.score = score
  6. def __del__(self):
  7. print('__del__方法被调用了')
  8. s = Student('lisi',95)
  9. del s
  10. input('请输入内容')

0x03:str方法

str方法返回对象的描述信息,使用print()函数打印对象时,其实调用的就是这个对象的str方法。

  1. class Cat:
  2. def __init__(self,name,color):
  3. self.name = name
  4. self.color = color
  5. tom = Cat('Tom','white')
  6. # 使用 print 方法打印对象时,会调用对象的 __str__ 方法,默认会打印类名和对象的地址名
  7. print(tom) # <__main__.Cat object at 0x0000021BE3B9C940>

如果想要修改对象的输出的结果,可以重写str方法。

  1. class Person:
  2. def __init__(self,name,age):
  3. self.name = name
  4. self.age = age
  5. def __str__(self):
  6. return '哈哈'
  7. p = Person('张三',18)
  8. print(p) # 哈哈 打印对象时,会自动调用对象的 __str__ 方法

一般情况下,我们在打印一个对象时,可能需要列出这个对象的所有属性。

  1. class Student:
  2. def __init__(self,name,score):
  3. self.name = name
  4. self.score = score
  5. def __str__(self):
  6. return '姓名是:{},成绩是{}分'.format(self.name,self.score)
  7. s = Student('lisi',95)
  8. print(s) # 姓名是:lisi,成绩是95分

0x04:repr方法

repr方法和str方法功能类似,都是用来修改一个对象的默认打印内容。在打印一个对象时,如果没有重写str方法,它会自动来查找repr方法。如果这两个方法都没有,会直接打印这个对象的内存地址。

  1. class Student:
  2. def __init__(self, name, score):
  3. self.name = name
  4. self.score = score
  5. def __repr__(self):
  6. return 'helllo'
  7. class Person:
  8. def __repr__(self):
  9. return 'hi'
  10. def __str__(self):
  11. return 'good'
  12. s = Student('lisi', 95)
  13. print(s) # hello
  14. p = Person()
  15. print(p) # good

0x05:call方法

对象后面加括号,触发执行。

  1. class Foo:
  2. def __init__(self):
  3. pass
  4. def __call__(self, *args, **kwargs):
  5. print('__call__')
  6. obj = Foo() # 执行 __in