【读书笔记】深入理解Python特性(三)

目录

1. 对象转换为字符串

2. 浅复制和深复制

3. 用抽象基类避免继承错误

4. namedtuple


1. 对象转换为字符串

  • 在print对象的时候会调用对象的__str__方法,在把对象作为表达式调用的时候会调用对象的__repr__方法。
  • 可以使用内置的str()和repr()方法来显示调用__str__和__repr__以更明确地表达意图。
  • __str__()侧重于面向用户的输出可读性,__repr__侧重于面向开发人员的调试友好性。
  • 如果没有__str__,需要__str__时会用__repr__替代。

2. 浅复制和深复制

  • list/set/dict创建的是浅副本,利用=也是创建的浅副本
  • copy.cpoy()和copy.deepcopy()可以进行浅复制和深复制

3. 用抽象基类避免继承错误

  • 为了强制派生类实现基类的方法,通常使用如下Python惯用手法:
class Base:
    def foo(self):
        raise NotImplementedError()

    def bar(self):
        raise NotImplementedError()

class Concrete(Base):
    def foo(self):
        return 'foo() called'

    # 忘记重载bar()了
    # def bar(self):
    #     return 'bar() called'

这种方法有两个问题:1. 实例化Base不会报错;2.实例化Concrete不会报错,只有调用缺失的bar方法才会报错

使用abc模块来定义抽象基类可以解决这个问题

from abc import ABCMeta, abstractmethod

class Base(metaclass=ABCMeta):
    @abstractmethod
    def foo(self):
        pass
    @abstractmethod
    def bar(self):
        pass

class Concrete(Base):
    def foo(self):
        pass

    # 忘记重载bar()了
    # def bar(self):
    #     return 'bar() called'

实例化Concrete会报错:

>>> c = Concrete()
TypeError:
"Can't instantiate abstract class Concrete
with abstract method bar"

4. namedtuple

  • namedtuple的定义和使用
from collections import namedtuple
Car = namedtuple('Car', ['color', 'mileage'])
my_car = Car('red', 113465)
ur_car = Car(color='blue', mileage=1.3)
print my_car.color # 'red'
print ur_car.mileage # 1.3
  • namedtuple适合在Python中以节省内存的方式快速手动定义一个不可变的类。
  • namedtuple的子类扩展

方法扩展

from collections import namedtuple
Car = namedtuple('Car', ['color', 'mileage'])

# 添加新方法和属性
class MyCar(Car):
    def hexcolor(self):
        if self.color == 'red':
            return '#ff0000'
        else:
            return '#000000'
  

上面的子类虽然可以通过self.property的方法添加属性,但是不会出现在tuple的属性列表里面,要扩展tuple属性必须使用基类元组的_fields方法:

from collections import namedtuple
Car = namedtuple('Car', ['color', 'mileage'])
MyCar = namedtuple('MyCar', Car._fields + ('charge',))
  • 一些内置的辅助方法:mycar._asdict()/mycar._replace(color='blue')/Car._make(['red', 999])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值