python中的魔法方法(学习日记13-1)
文章目录
python 类中提供了一种方法,以双下划线开始、双下划线结束,这就是魔法方法,魔法方法在起点过的时候就会被激活,自动执行。
魔法方法的特点:
- 魔法方法的命名,两端为双下划线
__
; - '咒语’名字由python官方定义,不可随意修改。
__init__
方法
__init__
方法:在创建一个类的对象时会被默认调用,不需手动调用。在开发过程中,如果希望在创建对象的同时就完成对象属性的设置,可以使用__init__
方法进行改造。
class Cat:
"""这是一个猫类"""
def __init__(self,name): # 重写了 __init__ 魔法方法
self.name = name
def eat(self):
return "%s爱吃鱼"%self.name
def drink(self):
return '%s爱喝水'%self.name
"""
tom = Cat()
TypeError: __init__() missing 1 required positional argument: 'name'
这种写法在运行时会直接报错!因为 __init__ 方法里要求在创建对象时,必须要传递 name 属性,如果不传入会直接报错!
"""
tom = Cat("Tom") # 创建对象时,必须要指定name属性的值
tom.eat() # tom爱吃鱼
注意:
- 在创建对象时,
__init__
方法会被默认调用; __init__
方法内的self参数,在创建对象时不许传递参数,python解释器会把创建好的对象直接赋值给self;- 在类的内部,可以使用self来使用属性和调用方法,而在类的外部,需要使用对象名来使用属性和调用方法;
- 存在多个对象,每个对象的属性都各自保存在的,都有各自独立的地址;
- 方法是所有对象所共享的,只占用一份内存空间,调用方法时会通过self来判断是那个对象所调用的。
__del__
方法
创建对象时,python解释器会默认调用__init__
方法,而当删除对象时,python解释器也会默认调用__del__
方法。
class Student:
def __init__(self,name,score):
print('__init__方法被调用了')
self.name = name
self.score = score
def __del__(self):
print('__del__方法被调用了')
s = Student('lisi',95)
del s
input('请输入内容')
__str__
方法
__str__
方法用来返回对象的描述信息,在使用print()
函数打印对象时,其实调用的就是对象的__str__
方法。
class Cat:
def __init__(self,name,color):
self.name = name
self.color = color
tom = Cat('Tom','white')
# 使用 print 方法打印对象时,会调用对象的 __str__ 方法,默认会打印类名和对象的地址名
print(tom) # <__main__.Cat object at 0x0000021BE3B9C940>
如果想要修改对象的输出内容,可重写__str__
方法,一般情况下,打印一个对象的部分属性即可。
class Student:
def __init__(self,name,score):
self.name = name
self.score = score
def __str__(self):
return '姓名是:{},成绩是{}分'.format(self.name,self.score)
s = Student('lisi',95)
print(s) # 姓名是:lisi,成绩是95分
与__str__
类似的是__repr__
方法,都是用来修饰一个对象的默认打印内容。
在打印一个对象时,如果未对__str__
方法进行重写,python解释器会自动查看__repr__
方法,如果这两个方法都没有进行重写,会将对象的内存地址打印,就像例子中<__main__.Cat object at 0x0000021BE3B9C940>
一样
注意:使用__str__
和__repr__
方法,都会修改对象转换为字符串的结果。一般来说,__str__
更注重可读性,而__repr__
方法的结果更注重正确性
比较运算符相关的魔法方法
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
return self.name == other.name and self.age == other.age
# def __ne__(self, other):
def __lt__(self, other):
return self.age < other.age
# def __gt__(self, other):
def __le__(self, other):
return self.age <= other.age
# def __ge__(self, other):
s1 = Student('zhangsan', 18)
s2 = Student('zhangsan', 18)
s3 = Student('lisi', 20)
print(s1 == s2)
print(s1 != s2)
print(s1 > s2)
print(s1 >= s2)
print(s1 <= s2)
print(s1 <= s2)
算数运算符相关的魔法方法
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __add__(self, other):
return self.age + other
def __sub__(self, other):
return self.age - other
def __mul__(self, other):
return self.age * other
def __truediv__(self, other):
return self.age / other
def __mod__(self, other):
return self.age % other
def __pow__(self, power, modulo=None):
return self.age ** power
s = Student('zhangsan', 18)
print(s + 1) # 19
print(s - 2) # 16
print(s * 2) # 36
print(s / 5) # 3.6
print(s % 5) # 3
print(s ** 2) # 324
类型转换相关的魔法方法
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __int__(self):
return self.age
def __float__(self):
return self.age * 1.0
def __str__(self):
return self.name
def __bool__(self):
return self.age > 18
s = Student('zhangsan', 18)
print(int(s))
print(float(s))
print(str(s))
print(bool(s))
if s:
print('hello')
魔法方法的意义
使用Python的魔法方法可以使Python的自由度变得更高,当不需要重写时魔法方法也可以在规定的默认情况下生效,在需要重写时也可以让使用者根据自己的需求来重写部分方法来达到自己的期待。