赞
踩
魔法方法的特点:
__
;__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;__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的自由度变得更高,当不需要重写时魔法方法也可以在规定的默认情况下生效,在需要重写时也可以让使用者根据自己的需求来重写部分方法来达到自己的期待。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。