何为定制类?

Python的class允许定义许多特殊方法,可以让我们非常方便地生成特定的类。在类中应用或者重写python的特殊方法,得到的类,就是定制类。

大家都知道print的用法。见下面例子

>>> lst = [2,3,4]
>>> print lst
[2, 3, 4]
>>> class Animal(object):
pass >>> a = Animal()
>>> print a
<__main__.Animal object at 0x01E6E990>

为什么print都能识别出lst和p的数据类型呢?

当我们执行如下代码的时候,就知道为什么了?

>>> print lst.__str__
<method-wrapper '__str__' of list object at 0x01E641E8>
>>> print a.__str__
<method-wrapper '__str__' of Animal object at 0x01E6E990>

__str__特殊方法,能识别出每一个数据类型。如果希望类的实例print a 打印出 ‘object of Animal class’.怎么办?重新定义__str__方法。

>>> class Animal(object):
def __str__(self):
return 'object of Animal class' >>> a = Animal()
>>> print a
object of Animal class

但是有时候发现直接敲

>>> a
<__main__.Animal object at 0x01E6E990>

__str__不会被调用。因为当直接敲a这行代码的时候,直接调用的并不是__str__.而是__repr__.

>>> class Animal(object):
def __str__(self):
return 'object of Animal class'
__repr__ = __str__ //偷懒一下 >>> a = Animal()
>>> a
object of Animal class

python的特殊方法很多,这里就不做一一介绍。下面主要介绍 __slots__,__call__,@property用法。

__slots__

python是一个动态语言,任何实例可以再运行期间都能动态添加实例的属性。但是有时候,想限制实例的添加属性,就使用__slot__方法。见下面例子:

>>> class Person(object):
__slots__ = ('name','age')//限制只有name和age的属性
def __init__(self,name,age):
self.name = name
self.age = age >>> p = Person('zhangsan',25)
>>> p.age
25
>>> p.name
'zhangsan'
>>> p.gender ='man'//直接动态赋属性gender,会出现错误 Traceback (most recent call last):
File "<pyshell#42>", line 1, in <module>
p.gender ='man'
AttributeError: 'Person' object has no attribute 'gender'

__slot__目的是限制当前类所能拥有的属性。所以在继承的环境下,子类不受影响。

>>> class Student(Person):
pass >>> s = Student('zhangsan',26)
>>> s.age
26
>>> s.name
'zhangsan'
>>> s.gender = 'man'//可以动态添加属性
>>> s.gender
'man'

所以子类Student如果想自己限制添加属性的话,也要通过__slots__来控制。

__call__

一个类的实例可以变成一个可调用的对象,只需要实现一个特殊的方法__call__就可以了。

接下来我们把Student类变成一个可调用的对象:

>>> class Student(Person):
def __init__(self,name,score):
self.name = name
self.score = score >>> class Student(Person):
def __init__(self,name,score):
self.name = name
self.score = score
def __call__(self,age):
print 'my name is %s'% self.name
print 'my age is %d'% age >>> s = Student('lixi',89)
>>> s(25)
my name is lixi
my age is 25

有时候你会发现s(25)乍一眼感觉不出来是一个函数还是对象的实例。python语言函数和对象的实例不是区分的很明显。

@property

上述的class Student中,当修改s实例的score值时,

>>> s.score = 89
>>> s.score = 9999

但是这样无法检查s实例的分数有效性。目前只能这样做:

>>> class Student(object):
def __init__(self,name,score):
self.name = name
self.__score = score
def set_score(self,score):
if score <0 or score >100:
raise ValueError('invalid score')
self.__score = score
def get_score(self):
return self.__score >>> s = Student('wangwu',89)
>>> s.set_score(89)
>>> s.set_score(9999) //非法值,ValueError Traceback (most recent call last):
File "<pyshell#75>", line 1, in <module>
s.set_score(9999)
File "<pyshell#71>", line 7, in set_score
raise ValueError('invalid score')
ValueError: invalid score

有时候觉得写s.set_score和s.get_score没有直接写s.score那么直接。有没有其他办法?既能直接的s.score又能检查score的有效性?python提供@property高阶函数这样功能需求的装饰器。

>>> class Student(object):
def __init__(self,name,score):
self.name = name
self.__score = score
@property
def score(self):
return self.__score @score.setter
def score(self,score):
if score <0 or score >100:
raise ValueError('invalid score')
self.__score = score >>> s = Student('liunx',98)
>>> s.score = 89
>>> s.score = 9999 Traceback (most recent call last):
File "<pyshell#82>", line 1, in <module>
s.score = 9999
File "<pyshell#79>", line 12, in score
raise ValueError('invalid score')
ValueError: invalid score

小结:

特殊方法:

1.任何数据实例都有特殊方法

2.特殊方法定义在class中

3.不需要直接调用

4.python的某些方法或者函数会直接调用数据实例的特殊方法

实现特殊方法:

1.重新编写用到的特殊方法

2.如果重新一些特殊方法,有些关联的特殊方法也要一并实现。例如:__setattr__,__getattr__,__delattr__

python学习第十七天 --定制类的更多相关文章

  1. Python:面向对象编程3 定制类(有更新)

    Python:面向对象编程3  定制类(有更新) ⚠️本文主要内容为对Data model相关知识点的提取学习记录.(内容来自文档和部分网页教程案例) ⚠️:这个连接指向<流畅的python&g ...

  2. Python学习第十五篇——类继承和类实例化

    学习Python类时,我们明白了类的本质,以及所谓的面向对象编程思想强调的对事物本身的属性,我们对某一类事物进行描述——采用了很多方法,这些方法描述了类的属性(比如猫科动物的眼睛,四肢,是否哺乳类等等 ...

  3. Python学习_13_继承和元类

    继承 继承的含义就是子类继承父类的命名空间,子类中可以调用父类的属性和方法,由于命名空间的查找方式,当子类中定义和父类同名属性或者方法时,子类的实例调用的是子类中的属性,而不是父类,这就形成了pyth ...

  4. 从0开始的Python学习012数据结构&对象与类

    简介 数据结构是处理数据的结构,或者说,他们是用来存储一组相关数据的. 在Python中三种内建的数据结构--列表.元组和字典.学会了使用它们会使编程变得的简单. 列表 list是处理一组有序的数据结 ...

  5. Python学习(七)面向对象 ——类和实例

    Python 面向对象 —— 类和实例 类 虽然 Python 是解释性语言,但是它是面向对象的,能够进行对象编程.至于何为面向对象,在此就不详说了.面向对象程序设计本身就很值得深入学习,如要了解,请 ...

  6. Python学习笔记之selenium 定制启动 chrome 的选项

    在自动化中,默认情况下我们打开的就是一个普通的纯净的chrome浏览器,而我们平时在使用浏览器时,经常就添加一些插件,扩展,代理之类的应用.所以使用 selenium 时,我们可能需要对 chrome ...

  7. Python学习笔记(一)类和继承的使用

    一年前就打算学Python了,折腾来折腾去也一直没有用熟练,主要是类那一块不熟,昨天用Python写了几个网络编程的示例,感觉一下子迈进了很多.这几天把学习Python的笔记整理一下,内容尽量简洁. ...

  8. python学习道路(day8note)(抽象类,类的方法,异常处理,socket编程)

    1.#面向对象 #抽象接口 === 抽象类 #就是架构师给你一个架子,你们去写,如果满足不了直接报错 #python2 print("python2---抽象类".center(2 ...

  9. python 学习笔记十七 django深入学习二 form,models

    表单 GET 和 POST 处理表单时候只会用到GET 和 POST 方法. Django 的登录表单使用POST 方法,在这个方法中浏览器组合表单数据.对它们进行编码以用于传输.将它们发送到服务器然 ...

随机推荐

  1. cf702A Maximum Increase

    A. Maximum Increase time limit per test 1 second memory limit per test 256 megabytes input standard ...

  2. [AS/400] Control Language(CL) 基本概念

    本文内容源于 Go4AS400 简介 AS400 Control Language(CL) 是由指令(Command)组合而成,用于控制操作和调用系统功能.在 CL 程序中,指令用于和系统 OS400 ...

  3. poj2299

    好吧,看到这个图片就知道是干什么的了,求逆序数- - 可以用线段树,貌似还可以用归并排序,这题应该是考的归并排序,毕竟是递归分治- - 基本上都忘了,再写一写试试吧. AC ///////////// ...

  4. + (void)load和+ (void)initialize有什么用处

    两个方法都可以进行一些类的初始化操作.其中有些小区别.+(void)load 方法只要加入了工程种,进行了编译,且.m中实现了这个方法,都会调用一次,值得注意的时没实现的子类是不会调用的,就算父类实现 ...

  5. the identity used to sign the executable is no longer valid.解决方法

    the identity used to sign the executable is no longer valid.解决方法 一.重新下载Provisioning Profile 1.到devel ...

  6. artTemplate的使用总结

    原生语法 使用原生语法,需要导入template-native.js文件. 在HTML中定义模板,注意模板的位置,不要放到被渲染区域,防止模板丢失. <script id="main_ ...

  7. python daemon化你的程序

    在之前的树莓派网关项目中遇到了这样一个问题,由于要把网关写的Server持续运行,尤其是要加电自动开启.发现ssh登录开启服务程序之后,当把pty退出时Server端自动断开了,这里想到的APUE中第 ...

  8. CSS3伪类选择器 图示

         

  9. [转]【基于zxing的编解码实战】精简Barcode Scanner篇

    通过<[搞定条形码]zxing项目源码解读(2.3.0版本,Android部分)>的分析,现在可以实现最终目标了:精简Barcode Scanner并将其中的编码和解码分离为两个独立的部分 ...

  10. Android中自定义View的MeasureSpec使用

    有时,Android系统控件无法满足我们的需求,因此有必要自定义View.具体方法参见官方开发文档:http://developer.android.com/guide/topics/ui/custo ...