【17】有关python面向对象编程的提高【多继承、多态、类属性、动态添加与限制添加属性与方法、@property】
一、多继承
案例1:小孩继承自爸爸,妈妈。在程序入口模块再创建实例调用执行
#father模块
class Father(object):
def __init__(self,money):
self.money = money def play(self):
print("play")
def eat(self):
print("eat") #mother模块
class Mother(object):
def __init__(self,faceValue):
self.faceValue = faceValue def watchTV(self):
print("watch TV")
def drink(self):
print("drink!") #child模块
from father import Father
from mother import Mother # 小孩继承自父亲,母亲
class Child(Father,Mother):
def __init__(self,money,faceValue):
Father.__init__(self,money)
Mother.__init__(self,faceValue) #调用,程序启动模块
def main():
child = Child(200,1000)
print(child.money,child.faceValue)
child.eat()
child.play()
child.watchTV()
child.drink() if __name__ == '__main__':
main() '''
输出:
200 1000
eat
play
watch TV
drink! '''# 注意:当两个父类的方法是相同的名字的话,默认调用写在多继承前边的那个类的方法。
二、多态
案例:猫和老鼠都是继承自动物类,动物类有基本的名字属性和吃的行为,再定义一个人类,采用多态的方式来喂每一个动物。
# 1 先定义一个animal类,供 任意一个新加入的动物继承
class Animal(object):
def __init__(self,name):
self.name = name def eat(self):
print(self.name+"吃")
# 2 创建一个猫类,继承自父类animal类
from animal import Animal # 让Cat继承自animal父类
class Cat(Animal):
def __init__(self,name):
super(Cat,self).__init__(name) #单继承的写法规范 # 3 写一个老鼠类,继承父类
from animal import Animal class Mouse(Animal):
def __init__(self, name):
super(Mouse, self).__init__(name) # 4 写一个人类,其中带有喂养任何动物的方法
from cat import Cat
from mouse import Mouse class Person(object):
'''
# 多种动物的话就太麻烦了
def feedCat(self,cat):
print("投放食物")
cat.eat()
def feedMouse(self,mouse):
print("给你食物")
mouse.eat()
'''
#用下述多态思想 --- 新的方法
def feedAnimal(self,ani):
print("给你食物")
ani.eat() # 5 程序执行入口文件 from cat import Cat
from mouse import Mouse
from person import Person tom = Cat("Tom")
jerry = Mouse("jerry") # 定义一个人类,让他可以喂猫,老鼠
per = Person() # 多态的喂的方法
per.feedAnimal(tom)
per.feedAnimal(jerry) '''
输出:
给你食物
Tom吃
给你食物
jerry吃
'''
三、类属性与对象属性
# 类属性: 用类名来调用的属性
# 对象属性:对象调用的属性 是__init__()的属性 class Person(object):
# 这里的属性是类属性,用类名来调用
name = "jiajia"
# 下边的是对象属性
def __init__(self, name):
self.name = name print(Person.name)
#输出:jiajia 打印的是类属性的信息 p=Person("LiHua")
print(p.name)
# 输出 LiHua 打印的是对象属性 '''
总结:
0 类属性是类名来调用的,对象属性是对象调用的
1 类属性的优先级是高于对象属性
2 用对象的方式访问对象属性,是打印出的是类属性信息
如:del p.name
print(p.name)
此时就会打印出同名的类属性。
'''
四、动态添加属性和方法与限制动态添加属性与方法
# 动态的添加属性和方法 # 创建一个空的类
class Person(object):
# 在定义类的时候,添加一个__slots__属性,来限制动态添加的属性信息
__slots__ = ('name','age','speak') per = Person()
#1 动态的添加属性
per.name = '佳佳' #2 动态的添加方法
from types import MethodType
def say(self):
print("我是中国人!") per.speak = MethodType(say,per)
#调用
per.speak() # 此处出错是因为此属性是无法动态的添加进去的,上边的slots方法里面限制的名字没有这个的。
per.facevalue = 15 # 思考:如果想要限制实例的属性怎么办?如只需要添加 name age height
# 解决方案
# 在定义类的时候,添加一个__slots__属性,来限制动态添加的属性信息
五、@property
这个装饰器主要解决的是如何把私有的属性按照正常的 方法来访问(不写set get方法)
# 如果想把__name 这种的可以直接用per.__name访问的话,不用函数来解决就需要用property解决啦
# 如果想把__name 这种的可以直接用per.__name访问的话,不用函数来解决就需要用property解决啦 class Person(object):
def __init__(self,age,name):
#属性是直接外部暴露的
self.age = age
#限制访问的方法解决,但是又需要写set和get方法才可以访问
self.__name = name
'''
def setName(self,name):
self.__name=name
def getName(self):
return self.__name
'''
# 弃用上述的方法,用下边的装饰器的方法,访问就可以直接用对象点 对应的方法来访问啦、
@property
def name(self):
return self.__name
@name.setter
def name(self,name):
if name =='':
print("不可以输入为空!")
else:
self.__name= name per = Person(24,'张老师')
# 因为上边用了property 所以对于私有的属性下边依旧可以用对象名+点+属性的方式来访问到。
per.name = "孙鑫"
print(per.name)
【17】有关python面向对象编程的提高【多继承、多态、类属性、动态添加与限制添加属性与方法、@property】的更多相关文章
- Python - 面向对象编程 - 三大特性之继承
继承 继承也是面向对象编程三大特性之一 继承是类与类的一种关系 定义一个新的 class 时,可以从某个现有的 class 继承 新的 class 类就叫子类(Subclass) 被继承的类一般称为父 ...
- 1.Java基础-面向对象编程思想(封装继承多态接口)
封装: 1.定义:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别. 2.封装的目的是:增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的 ...
- python面向对象编程进阶
python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...
- python 面向对象编程学习
1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...
- python—面向对象编程
面向对象编程简单来说就是基于对 类 和 对象 的使用,所有的代码都是通过类和对象来实现的编程就是面向对象编程! 面向对象的三大特性:封装.继承.多态 首先创建一个类 #使用class创建一个Schoo ...
- python 面向对象编程(一)
一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...
- Python面向对象编程指南
Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...
- Python面向对象编程(下)
本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...
- Python面向对象编程和模块
在面向对象编程中,你编写表示现实世界中的事物和情景的类,并基于这些类来创建对象. 编写类时,你定义一大类对象都有的通用行为.基于类创建对象时,每个对象都自动具备这种通用行为,然后根据需要赋予每个对象独 ...
随机推荐
- SQL 必知必会·笔记<4>使用通配符过滤数据
LIKE操作符 通配符(wildcard): 用来匹配值的一部分的特殊字符. 百分号(%)通配符 最常使用的通配符是百分号(%).在搜索串中,%表示任何字符出现任意次数: SELECT prod_id ...
- Spring Boot + Spring Cloud 构建微服务系统(十):配置中心(Spring Cloud Bus)
技术背景 我们在上一篇讲到,Spring Boot程序只在启动的时候加载配置文件信息,这样在GIT仓库配置修改之后,虽然配置中心服务器能够读取最新的提交信息,但是配置中心客户端却不会重新读取,以至于不 ...
- kubeadm部署kubernetes-1.12.0 HA集群-ipvs
一.概述 主要介绍搭建流程及使用注意事项,如果线上使用的话,请务必做好相关测试及压测. 1.基础环境准备 系统:ubuntu TLS 16.04 5台 docker-ce:17.06.2 kubea ...
- JQ的offset().top与js的offsetTop区别详解
一.前言 最近在做一个图片懒加载的插件,就纵轴(Y轴)而言,我需要时时获取图片的上偏移量,好判断是否已进入视图区域,而我所理解的是offsetTop应该是跟offset().top一样的,然后陷入了因 ...
- 基于vue2.0实现仿百度前端分页效果(一)
前言 最近在接手一个后台管理项目的时候,由于之前是使用jquery+bootstrap做的,后端使用php yii框架,前后端耦合在一起,所以接手过来之后通过vue进行改造,但依然继续使用的boots ...
- 基于Asp.Net Core的简单社区项目源代码开源
2019年3月27号 更新版本 本项目基于 ASP.NET CORE 3.0+EF CORE 3.0开发 使用vs2019 +sqlserver 2017(数据库脚本最低支持sql server 20 ...
- K均值聚类
聚类(cluster)与分类的不同之处在于, 分类算法训练过程中样本所属的分类是已知的属监督学习. 而聚类算法不需要带有分类的训练数据,而是根据样本特征的相似性将其分为几类,又称为无监督分类. K均值 ...
- XML部分
XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 两种形式:DTD以及schema: 本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展sc ...
- C#关闭子窗口而不释放子窗口对象的问题解决
在网上找来一些方式,感觉还都不错,下面给出方式: 在线扫描相机的调试过程中,需要开辟调试界面来进行位置的配置.调试结束后,一种常用的方式是将调试参数保存并在下次启动时加载.另一种简单方式是直接使用该参 ...
- IDEA 在使用的过程中字符间距变大的问题
解决办法:shift+空格半角全角快捷键