【学习笔记】--- 老男孩学Python,day18 面向对象------抽象类(接口类), 多态, 封装
抽象类,接口类
Python没有接口这个概念
抽象类(接口类): 目的是制定一个规范
要学会归一化设计,有重复的东西就要想把它们合并起来
from abc import ABCMeta, abstractclassmethod
class Payment(metaclass=ABCMeta): # 创建一个抽象 (接口) 类 的父类,
@abstractclassmethod
def pay(self): pass # 制定一个规范 只是放在那里
class Alipay(Payment):
def __init__(self,money):
self.money = money
def pay(self):
print('使用支付宝支付了%s' % self.money)
class Jdpay(Payment):
def __init__(self, money):
self.money = money
def pay(self):
print('使用京东闪付支付了%s' % self.money)
class WeChatpay(Payment):
def __init__(self,money):
self.money = money
def pay(self):
print('使用微信支付了%s' % self.money)
# 都有pay这个方法 就建一个pay的函数
def pay(obj):
obj.pay()
# 实例化一个Alipay的对象
a1 = Alipay(2000)
# 实例化一个Jdpay的对象
j1 = Jdpay(1999)
# 实例化一个Wechatpay的对象
w1 = WeChatpay(1)
pay(a1)
pay(j1)
pay(w1)
多态( python没有多态 有鸭子类型. ): 鸭子类型 : 看着像鸭子,他就是鸭子.
python是 弱类型语言
name = 'alex'
python 不管什么类型,传入函数,封装到对象中都可以.
这些类 都互称为鸭子.都有index方法
class Str:
def index(self):
pass
class List:
def abc(self):
pass
class Tuple:
def rrr(self):
pass
封装
广义的封装: 实例化一个对象,给对象空间封装一些属性.
狭义的封装: 私有制.
私有成员: __私有静态字段(变量), __私有方法, __私有对象属性
self.__ XXX 才可以访问
类的内部可以访问
# 类外部不能访问 # 类的内部可以访问 # 类的派生类也不能访问
私有静态字段(变量)
私有静态字段:仅类内部可以访问;
class B:
__money = 100000
class A(B):
name = 'alex'
__age = 1000
def func(self):
print(self.__age)
print(A.__age) # 对于私有静态字段,类的内部可以访问.
print('func....')
def func1(self):
print(self.__money)
print(A.__money)
a1 = A()
print(a1.name)
print(A.name)
print(a1.__age) # 实例化对象不能访问私有静态字段
print(A.__age) # 类名不能访问私有静态字段
# 对于私有静态字段,类的外部不能访问.
a1.func()
# 对于私有静态字段,类的内部可以访问.
a1.func1()
# 对于私有静态字段来说,只能在本类中内部访问,类的外部,派生类均不可访问.
# 可以访问,但是工作中千万不要用.
print(A._A__age)
print(A.__dict__)
私有方法
私有方法:仅类内部可以访问
class B:
__money = 100000
def __f1(self):
print('B')
class A(B):
name = 'alex'
def __func(self):
print('func....')
def func1(self):
# self.__func() # 类的内部可以访问
self.__f1()
a1 = A()
a1.__func() # 类外部不能访问
a1.func1() # 类的内部可以访问
a1.func1() # 类的派生类也不能访问.
私有对象属性
class Bmi:
def __init__(self,name, weight, heigth):
self.name = name
self.__weight = weight
self.heigth = heigth
def bmi(self):
b = self.__weight / (self.__weight**2)
return self.__weight
p1 = Bmi('张三',89,1.77)
print(p1.bmi())
面试题
class Parent:
def __func(self): # ③
print('in 父类 func')
def __init__(self): # ②
self.__func()
class Son(Parent):
def __func(self):
print('in 子类 func')
son1 = Son() # ①
'''
1.实例化一个son的对象
2.找__init__()方法 子类里面没有,找父类,父类中有__init__()方法
3.类外部不能访问 类的内部可以访问 类的派生类也不能访问
'''
面向对象结构与成员
''''''
'''
class A:
name = '静态字段' # ======> 第一部分 静态字段 部分
def __init__(self):
pass
# ======> 第二部分 方法部分
def func(self):
pass
'''
class A:
company_name = 'old_boy_educaion' # 静态变量
__iphone = '138xxxxxxxxx' # 私有静态变量(私有静态字段)
def __init__(self,name,age): # 普通方法(构造方法)
self.name = name # 对象属性(普通字段)
self.age = age # 私有对象属性(私有普通字段)
def func1(self): # 普通方法
pass
def __func(self): # 私有方法
pass
@classmethod # 类方法
def class_func(cls):
# 定义静态方法,无默认参数
print('静态方法')
@staticmethod # 静态方法
def static_func():
# 定义静态方法,无默认参数
@property # 属性
def prop(self):
pass
【学习笔记】--- 老男孩学Python,day18 面向对象------抽象类(接口类), 多态, 封装的更多相关文章
- python面向对象 : 抽象类(接口类),多态,封装(私有制封装)
一. 抽象类(接口类) 与java一样, python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类, 它的特殊之处在于只能被继承, 不能被实例化. 从设计角度去看, 如果类是从现实对 ...
- python day - 19 抽象类 接口类 多态 封装
一. 抽象类接口类即制定一个规范 特点: 1.不可被实例化. 2.规范子类当中必须事先某个方法. 3.在python中有原生实现抽象类的方法,但没有原生实现接口类的方法. 例题:制定一个规范就是,子类 ...
- python 全栈开发,Day21(抽象类,接口类,多态,鸭子类型)
一.昨日复习 派生方法和派生属性 super 只有在子父类拥有同名方法的时候, 想使用子类的对象调用父类的方法时,才使用super super在类内 : super().方法名(arg1,..) 指名 ...
- Java学习笔记(六):面向对象、接口和抽象类
类和对象 Java是一门面向对象的语言,下面我们来了解一下Java中的面向对象. 方法和重载 Java中的方法格式如下: 访问修饰符 返回值类型 方法名(参数){ 方法主体 } Java的方法支持重载 ...
- python学习笔记(十九)面向对象编程,类
一.面向对象编程 面向对象,是一种程序设计思想. 编程范式:编程范式就是你按照什么方式去编程,去实现一个功能.不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路,两种最重要的编程范式分 ...
- Flutter学习笔记(8)--Dart面向对象
如需转载,请注明出处:Flutter学习笔记(7)--Dart异常处理 Dart作为高级语言,支持面向对象的很多特性,并且支持基于mixin的继承方式,基于mixin的继承方式是指:一个类可以继承自多 ...
- 学习笔记《简明python教程》
学习笔记<简明python教程> 体会:言简意赅,很适合新手入门 2018年3月14日21:45:59 1.global 语句 在不使用 global 语句的情况下,不可能为一个定义于函数 ...
- python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码
python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...
- python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法
python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0.zfill()方法语法:s ...
随机推荐
- C++中vector的使用
在c++中,vector是一个十分有用的容器. 作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据. vector在C++标准模板库中 ...
- Mysql错误处理: /usr/bin/mysqld_safe: line xxx: xxxx Killed ... (mysql自动停止 Plugin FEDERATED is disabled 的完美解决方法)
哈哈哈,问题总算解决,内心抑不住的开心 centos mysql 问题:Plugin 'FEDERATED' is disabled. /usr/sbin/mysqld: Table 'mysql.p ...
- PHP中操作mysql的函数
(1)mysql_num_rows(),对应select操作,获取select结果中数据集的行数:(2)mysql_affected_rows(),对应update.delete.insert操作,影 ...
- Jmeter做并发测试(设置集合点)
集合点:让所有请求在不满足条件的时候处于等待状态. 如:我集合点设置为50,那么不满足50个请求的时候,这些请求都会集合在一起,处于等待状态,当达到50的时候,就一起执行.从而达到并发的效果. 那么J ...
- js获取时间的函数集
var mydate = new Date(); mydate.getYear(); //获取当前年份(2位) mydate.getFullYear(); //获取完整的年份(4位,1970-???? ...
- 深入理解Java接口和抽象类
对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用, ...
- ajax--底层代码
ajax:Asynchronous JavaScript And XML,异步的js与XML.ajax并不是一种新的编程语言,而是一种使用现有标准的新方法.ajax能够在不重载整个网页的情况下与服务器 ...
- Vue-Router路由Vue-CLI脚手架和模块化开发 之 使用props替代路由对象的方式获取参数
在上一章博文中使用路由对象$route获取参数时,组件和路由对象耦合,在这篇博文中就可以使用props来进行解耦: 1.在组件中使用props选项定义数据,接收参数: 2.在路由中,使用props选项 ...
- 【树】Populating Next Right Pointers in Each Node
题目: Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode ...
- 《构建之法》阅读笔记06-项目经理PM
软件团队里除了能写代码.测试代码和画图做设计的成员,还有一类角色,不做上面这些事情但也很重要,我们叫他们项目经理--PM. PM 的M 就是 Manager: P有这几种: Product Manag ...