python 中面向对象编程简单总结3--定制类
声明:资源来自慕课网python学习课程,以下只是个人学习总结,仅供参考
1.Python类的特殊方法
特征:以 __ 开头并结尾的方法,比如用于print的__str__() , __getattr__(),__setattr__()等
不需要在代码中直接调用, Python的某些函数和操作符会自动调用。
可以自己定制实现,如__str__()方法
class Person(object):
def __init__(self,name,gender):
self.name = name
self.gender = gender
def __str__(self):
return '(Person: %s , %s )' % (self.name,self.gender)
print Person("Roger","Male")
python定义了__str__() 和 __repr__()两个方法,前者显示给用户, 后者显示给开发人员,所以如果在交互命令行下修改了__str__(),再调用的话可能会没有调用修改的,而是调用了__repr__()。也可以让两个方法相同: __repr__ = __str__
2.特殊的setter和getter
在python中对应setter和getter可以由装饰器来写,从而使得调用的时候显得比较直接;当然,使用java中类似的方式也可以。由于python支持高阶函数,所以可以用装饰器把get/set方法装饰成属性。
class Student(object):
def __init__(self, name, score):
self.name = name
self.__score = score
@property #装饰get方法
def score(self):
return self.__score
@score.setter #装饰set方法,是@property装饰后的副产品
def score(self, score):
if score < 0 or score > 100:
raise ValueError('invalid score')
self.__score = score
#装饰之后,可以想使用属性一样设置score了
s = Student("Bob",59)
s.score = 60
print s.score
s.score = 1000
print s.score #会有异常,因为检查了score的范围
3.限制当前类所能拥有的属性: __slots__
class Student(object):
__slots__ = ('name', 'gender', 'score')
def __init__(self, name, gender, score):
self.name = name
self.gender = gender
self.score = score
4.可调用对象(对象也能调用)
Python中函数是对象,称为可调用对象,一个类的实例也可以变成一个可调用对象,只需要实现一个特殊的方法 __call__()
class Person(object):
def __init__(self,name,gender):
self.name = name
self.gender = gender
def __call__(self, *args, **kwargs): #实现__call__方法让实例可被调用
print args
class Fib(object):
def __call__(self, num):
a, b, L = 0, 1, []
for n in range(num):
L.append(a)
a, b = b, a + b
return L
f = Fib()
print f(10)
python 中面向对象编程简单总结3--定制类的更多相关文章
- python 中面向对象编程简单总结2
1.python中继承的特点: (1)总是从一个类继承,默认为object类 (2)不要忘记调用super.__init__方法来初始化父类的方法 def __init__(self,args): s ...
- python 中面向对象编程简单总结1
1.类的定义方式 class ClassName(object): #object 表示继承的类,默认为object pass 类的使用类似函数的调用,也可以认为是调用了一次模板来创建一个实例. 2. ...
- python 中面向对象编程的几个概念
Python super() 函数 super() 函数是用于调用父类(超类)的一个方法. super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会 ...
- Python:面向对象编程3 定制类(有更新)
Python:面向对象编程3 定制类(有更新) ⚠️本文主要内容为对Data model相关知识点的提取学习记录.(内容来自文档和部分网页教程案例) ⚠️:这个连接指向<流畅的python&g ...
- python基础-面向对象编程
一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 ...
- 可爱的 Python : Python中函数式编程,第一部分
英文原文:Charming Python: Functional programming in Python, Part 1 摘要:虽然人们总把Python当作过程化的,面向对象的语言,但是他实际上包 ...
- Python之面向对象编程学习
不知不觉,学到了python的面向对象编程思想.今天我们来讨论下面向对象编程的思想. 顾名思义,面向对象,就是面向于对象,这里所说的对象不是你现实生活中你的女朋友,你的老婆,你的爱人,在编程的世界里面 ...
- python基础——面向对象编程
python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...
- python的面向对象编程
面向对象编程是一种程序的范式,它把程序看成是对不同对象的相互调用,对现实世界建立的一种模型. 面向对象编程的基本思想,类和实例.类用于定义抽象对象,实例根据类的定义被创建出来. 在python当中我们 ...
随机推荐
- A start job is running for /etc/rc.d/rc.local ... ... no limit
/etc/rc.d/rc.local文件中配置了redis随机启动但是没有设置redis启动为守护进程(daemonize yes)导致redis启动后阻塞
- 编写一个参数JavaScript函数parseQueryString,它的用途是把url参数解析为一个对象
var url = "http://www.taobao.com/index.php?key0=0&key1=1&key2=2............."; var ...
- MySQL编码问题(无法插入中文)
1.问题描述 2.解决方案 1.问题描述 当使用django时,如果数据库是MySQL,插入中文会报错: Incorrect string value: '\xF0\x9F...' for colum ...
- svn代码回滚和合并的利器svn merge
1.svn merge可以将两个对象的diff体现到本地工作目录上. (1)两个对象 这个两个对象可以是同一个svn url的两个revison,也可以是不用的url,比如分支和主干. (2)diff ...
- PHP中composer的安装和使用
$ composer ______ / ____/___ ____ ___ ____ ____ ________ _____ / / / __ \/ __ `__ \/ __ \/ __ ...
- GIL与线程、进程、协程
GIL全局解释器锁: 1.相信大家都知道python代码是不能直接被机器cpu识别和执行的,它要经过python解释器(也就是我们执行时候的python3 name.py)被编译成机器语言,pytho ...
- C#中使用lockbits方法处理图像
转自 使用lockbits方法处理图像(转) 许多图像处理任务即时是最简单的文件类型转换,例如从32位深度到8位深度的格式转化,直接获得像素阵列要比使用GetPixel和SetPixel等方法的效率高 ...
- delphi XE8 Android SDK SET
delphi XE Berlin Android SDK SET RAD>Tools>Options>SDk Manager> https://dl-ssl.google.co ...
- MyBatis 学习记录2 Mapper对象是如何生成的
主题 以前我一直有一个问题不懂.并且觉得很神奇.就是Mybatis我们开发的时候只需要定义接口,并没有写实现类,为什么我们运行的时候就可以直接使用? 现在我想分享下这部分大致是怎么实现的. 在启动的时 ...
- Javascript 键盘事件
window.document.onkeydown = function (e) { var evt = window.event || e;//兼容性处理 var keycode = evt.key ...