python中的切片能否修改元祖_python之符合python风格的对象、序列的修改、散列和切片...

前提:这个是综合了两章的内容总结的,因为这两章本质都是在讲解符合python的对象编程,第一章实现了一个普通的vector2d对象,第二章实现的是一个多维向量类,让它看起来具有python标准的行为。

1 对象表示形式:

repr():当在控制台输入一个对象名,会调用这个方法,以便于开发者理解的方式返回对象的字符串表示形式。要实现__repr__特殊方法。

str():这个是给用户理解的方式返回对象的字符串表示形式。要实现__str__特殊方法。

bytes():调用它获取对象的字节序列表示形式,要实现__bytes__特殊方法。

format():这个跟str.format()函数,要实现__format__特殊方法。

在python3中,__repr__  __str__

__format__

都必须返回str类型,只有__bytes__犯规字节序列(bytes类型)

abs():实现__abs__特殊方法

bool():实现__bool__特殊方法

__iter__:该特殊方法的正确实现,会让类对象变为可迭代对象

2 clasmethod和staticmethod装饰器

这两个装饰器的使用上从其名就能看出大概,

classmethod:定义的是类方法,通常用于定义类的备用构造函数;被这个装饰的函数的第一个参数默认是类本身,而不是类的实例。

staticmethod:定义的是静态方法,其实这个静态方法就是普通的函数,第一个参数不是特殊值,就是跟普通函数的参数一样。

3 格式化显示format()

这个还是要多做练习,涉及到这种知识点琐碎,但是却很常用的,只能多加练习即可。

建议先从format开始,再是str.format。

在格式规范微语言中,整数使用的代码有‘bcdoxXn’,浮点数使用的代码有'eEfFgGn%',字符串使用的代码是's',因此在自定义的格式中,挑选其他的格式代码时最好不要跟这些冲突。

4 可散列的实现

把一个实例变成可散列,需要实现__hash__特殊方法(还需要__eq__方法),还要让__hash__调用的参数不可变,这样才是可散列的。需要将参数设为只读特性,这个书上说在后面有讲解,以后补上。

__hash__:这个实现一般使用位运算异或(^)混合各参数的散列值。

5 int()和float()

分别实现__int__,__float__,这样这个实例也可以作为int()/float()的参数来构造一个int或者float了。

6 私有属性和“受保护的”属性

python中并没有C++中的private,protected,因此它的私有属性和受保护的属性其实都是一些特殊形式以及一些共同遵守的规则,并不是强制性的。

通过两种方式吧,

a)在变量名前添加__,这样python解释器的操作如下:A类中有实例属性test(self.test这类属性),将其改为__test(尾部没有或者最多一个下划线),那么python解释器会把属性名存入实例的__dict__属性中,而且会在变量名前加一个下划线和类名,这样对A类来说就是_A__test,对继承A的B来说,就是_B__test,通过这种形式,实现了不让B类不经意的覆盖继承的A的属性。

b)上面的形式很多python程序猿很不喜欢,因此延伸出了下面这种:即通过在变量名前加_,如_test,这种形式是一种约定,一般不会在类的外部访问这类变量,看起来就像是受保护的。

7 __slots__类属性用来节省内存空间

默认情况下,python在各个实例中的__dict__属性中存储实例属性,字典通过散列表来提升速度,这种是以空间换速度的方式,当需要处理数百万个属性时,会很消耗内存,此时可以通过__slots__属性来节省内存,实现方式就是不用字典存储属性,而是换用其他数据结构来存储。一般用元组,因为元组不会改变。

继承超类的__slots__属性没有效果,必须自己定义该属性。

实现方式:创建一个类属性名为__slots__,然后将它的值设为字符串构成的可迭代对象,每个元素对应各个实例属性,这样就告诉了解释器,我这个类的所有实例属性都在这里了

>class A:

> __slots__ = ('a','b')

如果希望对象可以作为弱引用目标,还必须将__weakref__属性加入其中。

如果将__dict__加入其中,那么将吃掉内存,再次跟原来一样,所以不要这么做,这不是优化。

这个属性尽量不滥用,而且不要用来限制属性,而仅仅是用来节省内存。

8 覆盖类属性

类属性的值可以为实例属性提供默认值。比如类属性code='d',那么即使实例属性高没有code,也可以通过self.code来读取属性值,默认值就是类的同名属性值‘d',但是如果通过给实例属性赋值之后,再次读取的时候,就是赋值之后的值了,但是类的同名属性值还是不变。借助这个性质,可以给各个实例的实例属性定制不同的值。

如果想修改类属性的话,必须通过类名修改,类上修改了才能改变所有实例的默认值。但是有种更符合python风格的方法,就是通过继承该类,在子类中定义类属性为新的值,这种方式在Django中基于类的视图大量使用。

9 协议和鸭子类型

在第10章中实现了多维向量类,这里新增加的知识点大部分是与二维向量重复,只不过实现方式不同,只新增了几个知识点,从这里开始。

鸭子类型:这种编程风格就是不管它是什么,只关心实现符合协议的行为即可,这个会跟下一章的白鹅类型放到一起具体描述。

协议:就是非正式的接口,只在文档中定义,代码中不定义,比如说,序列协议:实现了__len__ __getitem__的类,就可以用再任何期待序列的地方。这种协议更像是C++里面对类的中文解释,但是在python这里有了更严谨的文档定义。

10 切片

需要实现__getitem__特殊方法,

切片原理:需要了解一个slice.indices属性,这个方法很有用,但是用的不多,主要是因为在内置类型中默认实现了这个,但是如果需要自定义类型,那还是需要自己实现这个方法,这个方法调用方式有点绕,多看看即可。没难度。

11 zip函数

这个函数有意思,大概会把两个(或多个)参数(可迭代对象)柔和到一块,返回一个生成器,将参数生成元祖,元祖作为这个生成器的生成对象的元素。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值