python魔法方法

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爱吃鱼

注意:

  1. 在创建对象时,__init__方法会被默认调用;
  2. __init__方法内的self参数,在创建对象时不许传递参数,python解释器会把创建好的对象直接赋值给self;
  3. 在类的内部,可以使用self来使用属性和调用方法,而在类的外部,需要使用对象名来使用属性和调用方法;
  4. 存在多个对象,每个对象的属性都各自保存在的,都有各自独立的地址;
  5. 方法是所有对象所共享的,只占用一份内存空间,调用方法时会通过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的自由度变得更高,当不需要重写时魔法方法也可以在规定的默认情况下生效,在需要重写时也可以让使用者根据自己的需求来重写部分方法来达到自己的期待。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值