python学习笔记1 -- 面向对象编程高级编程1
说起高级其实也就是些基础的东西,但是活用和熟用肯定会大幅度提升代码质量
首先要记录的是面向对象的灵活性,及如何去控制其灵活性,她允许你在实例中新增属性和方法,允许你给类新增属性和方法,也支持在定义类时就声明方法,正因为如此,才让他变得很灵活,但是很多时候不是随心所欲,如果过于灵活,那任何一个子类都可以对基类去修修改改,显然是不合适的,那么我们就需要去控制这种灵活度,于是slots函数出现了。
__slots__函数
slots函数限定了当前类中的属性值,一旦出现了slots函数,那么该类的实例只能使用slots中声明过得属性,举例如下
class Student(object):
__slots__ = ('name', 'age') def __init__(self, name, age):
self.name = name
self.age = age s = Student('baxiaobin', '12')
print (s.name)
print (s.age)
s.grade = 100
print (s.grade)
一个学生类有姓名和年龄,但是没有成绩,如果一个学生类的实例想要私自加一个成绩的值,则是不被允许的,因为你爸爸没有,你也不准有
那么问题来了,如果我爸爸没有,但是我爷爷有,那如何呢,那是可以的。因为这种家产,只要是你家的,你就可以用,所以爸爸没有爷爷有的话,那也是允许你用的
举例
class Student(object):
__slots__ = ('name', 'age') def __init__(self, name, age):
self.name = name
self.age = age class MaleStudent(Student):
__slots__ = ('hj') def __init__(self, hj):
self.hj = hj m = MaleStudent('yhj')
m.age=12
m.name= 'baxiaobin'
print (m.name)
print (m.hj)
如上,声明的实例如果比作自己,类比作爸爸,那爸爸是没有name属性的,只有爷爷有,那自己也是可以用爷爷的属性的。
好接下来说第二重要的东西,
@property 和
@方法名.setter
这两个暂时不用管其深层次逻辑,只知道是装饰器和用法就行了,@property允许将一个不带参数的方法定义为一个特殊方法,并且使用@方法名.setter的方式装饰带参数的赋值方法,被这么装饰过后,就允许我们通过
实例名.方法名 = 值 的方式进行赋值,同事允许通过实例名.方法名的方式进行值的调用。
举例如下
class Screen(object):
@property
def width(self):
return self._width @width.setter
def width(self, value):
self._width = value @property
def height(self):
return self._height @width.setter
def height(self, value):
self._height = value @property
def resolution(self):
return self._width * self._height # 测试:
s = Screen()
s.width = 1024
s.height = 768
print('resolution =', s.resolution) 上面的例子中,通过修饰了了width和heigth方法,这两个方法变成了直接通过名称赋值的方式,同事还修饰了一个只读的方法resolution 说完这个还要提一个,多重继承的概念
比如一个场景:
一个最简单的三层继承的例子,如果按照这个继承模式,最后应该会出现九个子类,而且如果继续继承,将会指数增长类的数量,显然不合适 第一级别 美食类
第二级别 美食类包括:火锅-冒菜-串串
第三级别 火锅类包括:清汤火锅(火锅),红汤火锅(火锅),鸳鸯锅火锅(火锅),冒菜类包括:清汤冒菜(冒菜),红汤冒菜(冒菜),鸳鸯锅冒菜(冒菜),串串类:。。。(共九个) 首先我们需要对每一个子类设计自己的方法,特麻烦,而且数量太多,代码重复性特别高,比如清汤的东西都是不辣的,但是我们在每一个清汤的
类中都需要声明一次不辣这个属性。为什么呢,因为爸爸没有啊,我爸爸只是火锅,冒菜和串串中的一个而已。 优化后如此继承
第一级别 美食类
第二级别 美食类包括:火锅-冒菜-串串 以及 红汤美食-清汤美食-鸳鸯美食
第三级别 清汤火锅(火锅,清汤) 不辣的属性继承自清汤类,火锅的属性继承自火锅,有了两个爸爸,我就是任性,我既有火锅爸爸,又有清汤爸爸,傲娇,任性,我就是清汤火锅,我为自己代言
这时候只要把不辣的属性放在清汤爸爸中欧冠,所有的有清汤爸爸的子类都可以用不辣这个属性啦,就很强大
最后提一点,多重继承,除了主属性之外,其他副属性通常后面用 Mixln修饰,
比如 StyleMisln 这种命名
以下是美食类代码:
python学习笔记1 -- 面向对象编程高级编程1的更多相关文章
- Python学习笔记(四)函数式编程
高阶函数(Higher-order function) Input: 1 abs Output: 1 <function abs> Input: 1 abs(-10) Output: 1 ...
- Python学习笔记(二)网络编程的简单示例
Python中的网络编程比C语言中要简洁很多,毕竟封装了大量的细节. 所以这里不再介绍网络编程的基本知识.而且我认为,从Python学习网络编程不是一个明智的选择. 简单的TCP连接 服务器代码如 ...
- python学习笔记_week6_面向对象
面向对象 介绍(特性(class.object--->封装.继承,多态)).--->世界万物,皆可分类:世界万物,皆可对象 只要是对象,就肯定属于某种品类:只要是对象,就肯定有属性 你是上 ...
- python学习笔记(6)--面向对象学习
本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引言 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做(人狗大战)的游戏,你就思 ...
- Python学习笔记捌——面向对象高级编程
__slots__特殊变量的使用: 由于Python是动态语言,允许先编写类,然后在创建实例的时候添加属性或者方法:而__slots__特殊变量就是,限制往类里添加属性的: 在创建类的时候,使用__s ...
- python 学习笔记7 面向对象编程
一.概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." ...
- python学习笔记(七):面向对象编程、类
一.面向对象编程 面向对象--Object Oriented Programming,简称oop,是一种程序设计思想.在说面向对象之前,先说一下什么是编程范式,编程范式你按照什么方式来去编程,去实现一 ...
- Python学习笔记之面向对象编程(三)Python类的魔术方法
python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法.这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功能 我主要把它们分为三个部分,下文也是分 ...
- python学习笔记1 -- 面向对象编程类和实例
由于之前有一定基础,所以python中的类的概接受的比较快,与其他语言一样, python也是通过类来进行事务的抽象,一切皆对象,要不然怎么说程序员不缺对象呢. 言归正传,python中类的声明是cl ...
随机推荐
- jQuery制作div板块拖动层排序
html结构: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...
- Dysregulation of Exosome Cargo by Mutant Tau Expressed in Human-induced Pluripotent Stem Cell (iPSC) Neurons Revealed by Proteomics Analyses(蛋白质组学揭示了人诱导的多能干细胞(iPSC)神经元中表达的突变Tau对外泌体的失调) 解读人:梁玉婷
期刊名:MCP 发表时间:(2020年4月) IF:4.828 单位:Skaggs School of Pharmacy and Pharmaceutical Sciences, University ...
- Redis系列(十):数据结构Set源码解析和SADD、SINTER、SDIFF、SUNION、SPOP命令
1.介绍 Hash是以K->V形式存储,而Set则是K存储,空间节省了很多 Redis中Set是String类型的无序集合:集合成员是唯一的. 这就意味着集合中不能出现重复的数据.可根据应用场景 ...
- visual studio 项目中使用EF创建的数据库,后续更新数据库操作(生产已经部署,不能删除数据库重新创建)
情景:SharePoint项目(其他类型的项目道理也一样),数据库是用EF(版本:6.0.0.0)创建的,生产环境已经使用,所以后续修改数据库,只能通过更新来实现. 下面是具体的操作方式: 1.vis ...
- python_Linux系统的常用命令(三)
用户权限常用命令 1.用户和权限 r--读--4, w--写--2, x--执行--1 chmod 可以修改用户/组对文件/目录的权限 格式:chmod +/-rwx 文件名/目录名 su -用户:切 ...
- 阿里云Linux CentOS8.1 64位服务器安装LNMP(Linux+Nginx+MySQL+PHP) 并发调试之MySQL配置
mysql高并发配置 要在mysqld下设置 1. 修改back_log参数值:由默认的50修改为500.(每个连接256kb,占用:125M) back_log=500 back_log值指出MyS ...
- 关于CSS自文档的思考_css声明式语言式代码注释
obert C. Martin写的<Clean Code>是我读过的最好的编程书籍之一,若没有读过,推荐你将它加入书单. 注释就意味着代码无法自说明 —— Robert C. Martin ...
- 线性DP之免费馅饼
题目 思路 线性DP,思路很容易就能想到,f[i][k]数组定义为第i秒在k位置时从上一位置j转移过来的最优解,易得f[i][k]=max(f[i][k],f[i-1][j]+search(i,k)) ...
- 「JLOI2015」城池攻占 可并堆
传送门 分析 如果直接暴力枚举的话肯定会超时 我们可以从下往上遍历,维护一个小根堆 每次到达一个节点把战败的骑士扔出去 剩下的再继续向上合并,注意要维护一下其实的战斗力 可以像线段树那样用一个lazy ...
- 1. 初识Jackson -- 世界上最好的JSON库
要想人前显贵,必须背后受罪.关注公众号[BAT的乌托邦]开启专栏式学习,拒绝浅尝辄止.本文 https://www.yourbatman.cn 已收录,里面一并有Spring技术栈.MyBatis.中 ...