目录
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])