Python3入门(九)——面向对象OOP高级编程
一、使用__slots__限制属性绑定
动态绑定实例的方法:
class Person(object):
def run(self):
print("奔跑吧!")
p1 = Person()
p1.name = "江北"
但是这样,"new出来"的实例就可以为所欲为的绑定任意属性了。
Python中提供了__solts__来限制属性绑定,这样就只能动态绑定指定的属性了!
class Person(object):
__slots__ = ("name", "age") def run(self):
print("奔跑吧!") p1 = Person()
p1.name = "江北"
// 更多详细限制,不在此处赘述
二、使用@property
上一章已经讲到,定义的属性可以通过get set来限制,但是似乎不像Java的IDEA一样,可以直接快捷生成对应get set,Python的手写set get显然不符合Python简洁的特性,为此,Python引入了@property(通过前面知道是一个装饰器)来完成这个功能。
不使用装饰器之前:
class Person(object):
def get_age(self):
return self._age
def set_age(self, age):
if age > 0:
self._age = age
p1 = Person()
p1.set_age(18)
print(p1.get_age())
使用之后:
class Person(object):
@property
def age(self):
return self._age @age.setter
def age(self, value):
if age > 0:
self._age = value # 实际使用p1.age = xx时转为使用set,实际使用p1.age时转为get
p1 = Person()
p1.age = 19
print(p1.age)
完整示例,参考:https://blog.csdn.net/u013205877/article/details/77804137
三、多重继承
直接看写法:
class Dog(Mammal, Runnable):
pass
通常,这种多重继承我们称之为 MixIn(mixin)
四、定制类
形如之前限制绑定的__slots__就是存在特殊用途的,也就是之前介绍的__xx__形式的在Python中是特殊变量。以下介绍几个常用的:
1.__str__
在这个方法中返回合适的字符串,就完成了python的toString()了:
class Person(object):
def __init__(self, name):
self.__name = name def __str__(self):
return "这是toString(),name是:" + self.__name print(Person("江北"))
这样直接打name出来的也是不美化的,解决方式是再定义一个方法,偷懒的写法如下;
__repr__ = __str__
2.__iter__
要像list那种用于for .. in xx中,需要实现__iter__并返回迭代对象
3.__getattr__
用于获取属性,例如类中不存在这个属性时,则Python会尝试去调用__getattr__去获取(存在时正常调用):
class Person(object):
def __init__(self, name):
self.__name = name def __str__(self):
return "这是toString(),name是:" + self.__name def __getattr__(self, item):
if item == "age":
return 18 print(Person("江北").age)
// 实际应用参考廖老师博客
4.__call__
用来调用类似以下的情况:
p = Person("江北")
p()
这种直接调用实例()方法,类似scala中的apply(),Python中使用如下:
class Person(object):
def __init__(self, name):
self.__name = name def __call__(self, *args, **kwargs):
print("call被调用,携带参数为:" + args[0]) p = Person("江北")
p("abc")
// __call__可以携带参数,也可以不携带参数
五、枚举类
直接看两种定义方法
from enum import Enum
Month = Enum("Month", ("JAN", "FEB")) # value默认从1开始计数
class M(Enum):
JAN = 0 # 设置value为0
FEB = 1
更多,参考:https://www.cnblogs.com/xiexiaoxiao/p/7100950.html
六、元类
1.使用type()动态创建类
Hello = type('Hello', (object,), dict(hello=fn)) # 创建Hello class
要创建一个class对象,type()函数依次传入3个参数:
- class的名称;
- 继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;
- class的方法名称与函数绑定,这里我们把函数
fn绑定到方法名hello上。
2.metaclass元类
元类就是创建类的类。元类和类的关系,类似于类和实例的关系
让人头大的这一块就不在入门阶段介绍了(就像动态代理,平时也很少写到)。有增强篇时再做介绍
Python3入门(九)——面向对象OOP高级编程的更多相关文章
- Python 面向对象之高级编程
7.面向对象高级编程 7.1使用__slots__ python动态语言,new 对象后绑定属性和方法 Tip:给一个实例绑定的方法,对其他对象无效.可以通过对class绑定后,所有对象可以调用该方法 ...
- web入门之十 JS高级编程基础
学习内容 JavaScript函数 JavaScript类和对象 解析JSON数据 能力目标 深入了解JavaScript函数 熟悉JavaScript面向对象编程 熟练进行JSON数据解析 本章简介 ...
- Python面向对象的高级编程
数据封装.继承和多态只是面向对象程序设计中最基础的3个概念.在Python中,面向对象还有很多高级特性,允许我们写出非常强大的功能. 我们会讨论多重继承.定制类.元类等概念. 使用__slots__ ...
- 面向对象的高级编程&IO编程
1.给类对象绑定的函数,只对这个对象生效, 而对类绑定的对象, 所有的对象都可以调用. 栗子: def set_score(self, score): self.score = score s.set ...
- Python3入门(十一)——IO编程
一.文件读写 python的文件操作和C是兼容的 1.读文本文件 读文件操作如下: f = open("F:/1.txt", "r") data = f.rea ...
- ES6入门九:Symbol元编程
JS第七种数据类型:Symbol Symbol的应用场景 11个Symbol静态属性 Symbol元编程 一.JS第七种数据类型:Symbol 在ES6之前的JavaScript的基本数据类型有und ...
- Python3入门(六)——函数式编程
一.高阶函数 1.可以通过变量指向函数,达到类似别名的效果: >>> f = abs >>> f(-10) 10 2.函数的参数可以是函数,也就是函数可以作为一个入 ...
- Python3入门(五)——高级特性
一.切片 对于取指定索引的值,python提供了切片来简化傻傻的循环 list2 = ["apple", "water", "banana" ...
- PHP面向对象(OOP)编程入门教程
面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行PHP的高级编程,对于提高 PHP编程能力和规划好Web开发构架都是非常有意义的.下面我们就 ...
随机推荐
- 高性能JavaScript(DOM编程)
首先什么是DOM?为什么慢? DOM:文档对象模型,是一个独立于语言的,用于操作XML和HTML文档的程序接口(API) 用脚本进行DOM操作的代价很昂贵.那么,怎样才能提高程序的效率? 1.DOM访 ...
- [我的阿里云服务器] —— FTP配置
前言: FTP是我们用来向服务器上传或者下载文件很重要的一个工具,特别是云服务器,无法使用外设传送文件. 所以下面我们就来配置一下FTP,但是FTP的21端口,通常也是黑客进攻的一个目标,所以需要小心 ...
- mongodb2.X添加权限
1.连接mongodb数据库(如果mongo命令没有做环境变量配置,需要定位到有mongo命令的目录) root@AY140709212620347s22Z:~# mongo MongoDB shel ...
- mysql 安全模式
今天,执行一条delete语句的时候报错如下: Error Code: 1175. You are using safe update mode and you tried to update a t ...
- cmd 命令总结
1.windows 系统定时关机 定时关机:shutdown -s -t 300 at 18:30 shutdown -s 取消定时:shutdown -a 注意:3 ...
- jquery中ajax的dataType的各种属性含义
参考ajax api文档:http://www.w3school.com.cn/jquery/ajax_ajax.asp dateType后接受的参数参数类型:string 预期服务器返回的数据类型. ...
- 一起学习Boost标准库--Boost.StringAlgorithms库
概述 在未使用Boost库时,使用STL的std::string处理一些字符串时,总是不顺手,特别是当用了C#/Python等语言后trim/split总要封装一个方法来处理.如果没有形成自己的com ...
- 【Alpha 冲刺】 3/12
今日任务总结 (未完成) 人员 今日原定任务 完成情况 遇到问题 贡献值 胡武成 完成API文档编写 已完成App端api,Web端api还在持续 时间紧 孙浩楷 理解掌握在线编辑插件使用 加深了对所 ...
- 【Ansible 文档】【译文】配置文件
这里说明一下配置文件的内容,原文地址:http://docs.ansible.com/ansible/latest/intro_configuration.html 这个与[Ansible 文档]配置 ...
- python第二十九课——文件读写(复制文件)
自定义函数:实现文件复制操作有形参(2个) 没有返回值相似版(不用) def copyFile(src,dest): #1.打开两个文件:1个关联读操作,1个关联写操作 fr=open(src,'rb ...