【Python面向对象05】方法的补充

本文详细介绍了Python面向对象编程中的特殊方法,包括私有化方法、内置的__str__和__repr__方法、__call__方法用于对象调用、__getitem__、__setitem__和__delitem__用于索引操作、切片操作、比较操作以及遍历操作。此外,还提到了描述器的概念,用于属性操作。通过这些特殊方法,开发者可以自定义对象的行为和交互方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

05 方法相关补充

1. 私有化方法:

  • 也是方法名前面加两个下划线

2. 内置特殊方法:

  • 生命周期方法详见另一笔记

  • 其他内置方法:

    1. 信息格式化操作

    • [__str__]
    def __str__(self):
       return 撰写语句展现实例的属性信息
       
    # 此时输出的就是上述方法设定的语句   
    print(实例)
    
    • [__repr__],可以实现和上述方法一样的方法,但是当上述方法已经存在时,打印实例默认调用上述方式,这个方法主要面向开发人员使用
    #但是可以利用专门调用的方式来调用这个方法
    print(repr(实例))
    
    #可以在交互模式下,直接输入实例就默认调用此方法,如:
    >>>实例名
    

    2. 调用操作:[__call__]

    —— 让一个实例对象可以直接调用

    def __call__(self,*args,**kwargs):
       pass
    
    #实例对象
    p = 类名()
    p()         #这样就可以调用上述方法
    #传入参数,未指明的存在元组中,指明的存在字典中
    p(123,243, name = "sz")
    

    应用场景1: 更方便的指定和传入参数

    class PenFactory:
       def __init__(self, p_type):
          self.p_type = p_type
    
       def __call__(self, p_color):
          print("创建了一个%s这个类型的画笔, 它是%s颜色" % (self.p_type, p_color))
    
    gangbiF = PenFactory("钢笔")
    gangbiF("红色")
    gangbiF("绿色")
    gangbiF("黄色")
    

    3.索引操作

    • 增改:[__setitem__]
    • 查:[__getitem__]
    • 删:[__delitem__]
    class Person:
       def __init__(self):
          self.cache = {}
    
       def __setitem__(self, key, value):
          # print("setitem", key, value)
          self.cache[key] = value
    
       def __getitem__(self, item):
          # print("getitem", item)
          return self.cache[item]
    
       def __delitem__(self, key):
          # print("delitem", key)
          del self.cache[key]
    
    p = Person()
    p["name"] = "sz"
    
    print(p["name"])
    
    del p["name"]
    
    # print(p["name"])
    print(p.cache)
    

    4.切片操作

    对一个实例对象进行切片操作,统一由“索引操作”中的几个方法进行管理

    简单示例

    class Person:
    
       def __init__(self):
          self.items = [1, 2, 3, 4, 5, 6, 8]
       
       #自定义的切片操作,
       #key应该是slice类型
       #有默认的start,end,step属性,所以方便赋值
       def __setitem__(self, key, value):
          if isinstance(key, slice):
                self.items[key] = value
    
       def __getitem__(self, item):
          print("getitem", item)
    
       def __delitem__(self, key):
          print("delitem", key)
    
    p = Person()
    p[0: 4: 2] = ["a", "b"]
    print(p.items)
    

    5. 比较操作

    可以自定义对象“比较大小,相等以及真假”规则

    • [__eq__] —— 内置的类比较规则重写方法,当自定义类进行比较时,自动调用这个方法。这个方法主要用于匹配相等时的返回
    • [__ne__] —— 内置的类比较时,如果不相等调用的方法,如果没有重写,不相等时默认调用上述方法
    • [__gt__] —— 大于
    • [__ge__] —— 大于等于
    • [__lt__] —— 小于
    • [__le__] —— 小于等于
    • [__bool__] —— 确定类实例的布尔值

    注意

    1. 如果对于反向操作的比较复杂,只定义了其中一个方法,但使用的是另一种比较运算,那么解释器会采用调换参数的方式进行调用该方法;
    2. 但是,默认不会采用叠加操作,比方说,如果你只定义了相等小于两个方法,想要两个类实例比较小于等于,就会报错
    3. 针对第二点,可以调用functools模块,在类上面加上@functools.total_ordering装饰器,将会自动补全其余比较方法,以完成期望的比较效果

    6.遍历操作

    • 使用for in 遍历:
      1. 利用 实现__getitem__方法
      #当已定义__getitem__方法后,注意设定终止条件
      for i in 实例:
      #这里的 i 就是自动调用的__getitem__方法
          print(i)
      
      1. 利用 实现__iter__和__next__方法
      # 撰写__iter__方法,构造一个迭代器
      # 然后利用__next__方法,访问迭代元素
      # 如下所示,已经略去类框架
          def __iter__(self):
             self.result = 1
             return self
      
          def __next__(self):
             self.result += 1
             if self.result >= 6:
                   raise StopIteration("停止遍历")
             return self.result
      
       p = Person()
      
       for i in p:
          print(i)
      
      注意:iter()方法,可以传入一个可调用对象,当想用自定义的实例作为参数传入时,需要对该类重写__call__()方法

    7.描述器

    可以描述一个属性操作的对象

    • 利用property()类,亦可以用上文的@property装饰器
    #以下操作在类的定义里写,这样调用实例的属性时就可以直接操作了
    属性名 = property(查找方法,增改方法,删除方法)
    
    • 自行实现__get__()__set__()__delete__()方法
      注:
      1. 资料描述器,实现了get,set
      2. 非资料描述其,只实现了get
      3. 属性调用优先级:
        资料描述器 > 实例属性 > 非资料描述器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值