# coding:utf-8
# py2中的经典类
# class D:#没有继承object是经典类
# pass
# # def func(self):
# # print('d')
# class B(D):
# pass
# # def func(self):
# # print('b')
# class C(D):
# pass
# def func(self):
# print('c')
# class A(B,C):
# pass
# # def func(self):
# # print('a')
# a = A()
# a.func()
# python2.x中的经典类
# 多继承中深度优先
# 没有mro提示你顺序
# 没有super # python2中的新式类 基本和python3中的新式类相似
class D(object):#继承了object是新式类
pass
# def func(self):
# print('d')
class B(D):
pass
# def func(self):
# print('b')
class C(D):
pass
def func(self):
super(C,self).func()
print('c')
class A(B,C):
pass
# def func(self):
# print('a')
a = A()
a.func()
print(A.mro()) # 方法
print(A.__mro__) # 属性
# python2.x版本中存在两种类
# 经典类
# 不主动继承object类的所有类都是经典类
# 继承关系遵循深度优先算法
# 没有mro,没有super
# 新式类
# 所有继承object类的都是新式类
# 和py3一样继承遵循mro顺序和c3算法
# 有mro方法,但是super的使用必须传参数super(子类名,对象名).方法名 # python3.x中的类和py2.x中的新式类有什么区别???
# 不需要主动继承object
# py3中super()可以直接用,py2中使用必须传参数super(子类名,对象名).方法名 # 所有继承了object类的都是新式类 <==> 所有的新式类都继承object类
# PEP8规范 : 跨环境 无论在py2还是py3中定义一个新式类,都需要加上object这个继承
# class 类名(object):
# pass
# class 子类(类名):
# pass
# python中处处是多态 # python是一门自带多态的语言
# java 的多态
# 强数据类型的语言
# def pay(float money): # float 2.35 - 类 对象
# print(money)
# pay() # class Payment(object):pass
# class Alipay(Payment):
# def pay(self,money):
# pass
# class Wechatpay(Payment):
# def pay(self,money):
# pass
# def pay(Payment person_obj,float money):
# person_obj.pay(money)
# alex = Alipay()
# pay(alex,24.5)
# yuan = Wechatpay()
# print(yuan,23.5)
# 一个类表现出来的多种状态
# 支付Payment是一个类,多种状态: 使用阿里支付Alipay,使用微信支付Wechatpay
# 支付表现出来的多种状态 :
# 第一种状态 支付宝支付
# 第二种状态 微信支付
# class Animal(object):pass
# class Cat(Animal):
# def eat(self):pass
# class Dog(Animal):
# def eat(self):pass
# def eat(Animal obj):
# obj.eat()
# 小花 = Cat() # 小花就是猫类的对象 类==类型==数据类型,小花的类型就是Cat
# 小黑 = Dog()
# eat(小花)
# eat(小黑)
# int str list tuple dict set 内置的数据类型
# Cat Dog Animal 自定义的类/数据类型
# 动物吃表现出来的多种状态:
# 猫吃
# 狗吃
# python
# class Cat(object):
# def eat(self):pass
# class Dog(object):
# def eat(self):pass
# def eat(obj):
# obj.eat()
# 小花 = Cat() # 小花就是猫类的对象 类==类型==数据类型,小花的类型就是Cat
# 小黑 = Dog()
# eat(小花)
# eat(小黑)
# 动物吃表现出来的多种状态:
# 猫吃
# 狗吃
# class Alipay(object):
# def pay(self,money):
# pass
# class Wechatpay(object):
# def pay(self,money):
# pass
# def pay(person_obj,money):
# person_obj.pay(money)
# alex = Alipay()
# pay(alex,24.5)
# yuan = Wechatpay()
# print(yuan,23.5)
# pay('abc',23.5)#错误,无法判断输入的数据类型是否正确
# 在python中体现的多态:     
  # 几个类拥有同名的方法,可以写一个函数,来统一进行调用 - 归一化设计
# java要要求传递数据的数据类型? (通过继承来实现的)
  # 是为了代码不出错,只要你能够顺利的调用这个函数,那么内部的执行就大大降低出错的概率
# python却不要求?
  # 更多的不是硬性的规定,但是可能会因为传递的参数不符合规则而使得代码报错,但是大大降低了代码繁琐程度
# 鸭子类型 
# 是python语言中特有的,不依赖于继承和规范来进行的一种约定(依赖继承和规范特指:java中的多态和接口)
# 如果两个类都需要做某一件事情,那么应该起相同的名字,这个时候,对于做的这件事情来说,这两个类就变成了鸭子类(归一化设计的表现)

# 中心思想 : 不同类之间的相同的方法都应该用同一个名字  
# 抽象类 规范 : 不同类之间的相同的方法都应该用同一个名字
# 接口类 规范: 不同类之间的相同的方法都应该用同一个名字
# class Animal:pass
# class Cat(Animal):
# def eat(self):pass
# class Dog(Animal):
# def eat(self):pass
# def eat(Animal obj):
# obj.eat()
# 多态 : 已经实现了"不同类之间的相同的方法都用同一个名字",解决不同类的对象的传参问题 class Cat:
def eat(self):pass
class Dog:
def eat(self):pass
def eat(obj):
obj.eat()
# 鸭子类型 : 不需要解决类的对象的传参问题,就可以直接利用已经实现的"不同类之间的相同的方法都用同一个名字"
# 什么是封装?     
  # 广义上(大家认为的) :
    # 把一类事务的相同的行为和属性归到一个类中
# class Dog:
# def bite(self):pass
    # 狭义上(学术上的定论) :
      # 把一些特殊的属性和方法藏在类中
      # 外部无法调用,只有内部可以调用
# 隐藏静态属性
class Dog:
# dog_sum = 0 # 不安全,因为这个属性可以在类的外部被随便修改
__dog_sum = 0 # 安全,通过dog_sum方法和__变量名让属性变成只能看不能改的值
def __init__(self):
self.count()
def count(self):
Dog.__dog_sum += 1 # 可以从一个类的内部使用__dog_sum的属性
def dog_sum(self):
return Dog.__dog_sum print(Dog.__dict__)
alex = Dog()
print(Dog.__dict__)
# print(Dog.__dog_sum) # 不可以从外部直接使用这个变量
print(alex.dog_sum())

class Dog:
__dog_sum = 0 # 私有的静态属性 _Dog__dog_sum
def __init__(self):
self.count()
def dog_sum(self):
return Dog.__dog_sum # 只要是在类的内部使用__名字,默认就被改成 _类名__名字 print(Dog.__dict__)
print(Dog._Dog__dog_sum) # 绝不能在后续我们的代码中出现这种情况,这是bug不能用
# 只要是在类的内部的名字前面加上双下划线
# 那么这个名字 就变成 私有的 (只能在类的内部使用,不能在类的外部使用)
# 在定义的时候,存储的名字就会发生变化 _类名__名字
# 因此 在类的外部就不会被调用到了
# 在类的内部 使用__名字,默认就被改成 _类名__名字

# class Dog:
# def __init__(self,name,password):
# self.__name = name # 不希望某个值被随便修改
# self.__password = password # 不希望某个值被从类的外部看到
# def login(self,usr,pwd):
# if usr == self.name and pwd == self.__password:
# return True
# def name(self):
# return self.__name
# def set_name(self,new_name):
# if type(new_name) is str:
# self.__name = new_name
#
# alex = Dog('alex','sb123')
# print(alex.login('alex','sb222'))
# print(alex.login('alex','sb123'))
#
# print(alex.name())
# alex.set_name('alex_sb')
# print(alex.name()) # 只能在类的内部被调用,保证了类内部数据的安全,不会被别人随意修改
# 私有静态属性 : 为了不随意被外部修改
# 私有方法 : 不希望被外部随意调用
# 私有的对象属性 :
# 不希望某个值被随便修改
# 不希望某个值被从类的外部看到 # 私有的名字能不能被子类继承?为什么?






 

day29 Pyhton 面向对象 多态 封装的更多相关文章

  1. day29 Pyhton 面向对象 继承进阶

    一.内容回顾 初识继承 父类\基类\超类 子类\派生类 派生 :派生方法.派生属性 单继承 继承的语法class子类名(父类名) 解决开发中代码冗余的问题 子类继承了父类之后,可以调用父类中的方法 如 ...

  2. python面向对象 : 抽象类(接口类),多态,封装(私有制封装)

    一. 抽象类(接口类) 与java一样, python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类, 它的特殊之处在于只能被继承, 不能被实例化. 从设计角度去看, 如果类是从现实对 ...

  3. Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

    Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装:            将一些东西封装到一个地方,你还可以取出来( ...

  4. Python面向对象04 /封装、多态、鸭子类型、类的约束、super

    Python面向对象04 /封装.多态.鸭子类型.类的约束.super 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 3. 鸭子类型 4. 类的 ...

  5. 3、C#面向对象:封装、继承、多态、String、集合、文件(下)

    面向对象多态 一.装箱和拆箱 装箱:将值类型转换为引用类型.object o = 1:值类型给引用类型赋值 拆箱:将引用类型转换为值类型.int n = (int)o; 强制转换为值类型 满足条件:两 ...

  6. python面向对象之继承/多态/封装

    老师说,按继承/多态/封装这个顺序来讲. 子类使用父类的方法: #!/usr/bin/env python # coding:utf-8 class Vehicle: def __init__(sel ...

  7. 【基础】Equal方法、面向对象-多态-继承-封装

    package Test; public class L3_1 { public static void main(String[] args) { C c1=new C(100); C c2=new ...

  8. AJPFX关于面向对象之封装,继承,多态 (下)

    (3)private: 对于对于成员来说:只能在该成员隶属于的类中访问. 对于类来说:类不可以声明为private. 4)protected: 对于对于成员来说:相同包中的类可以访问(包访问权限):基 ...

  9. python面向对象之封装,继承,多态

    封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容.在python的类中,封装即通过__init__函数将数据赋给对应的变量进行保存,便于其他地方使用 所以,在使用面向对象的封装特 ...

随机推荐

  1. (006)增加Blazor WebAssembly子站,推荐一个可视化linux ssh客户端FinalShell

    增加一个Blazor WebAssembly子站,并添加来回链接. 同时推荐一个好用的ssh客户端:FinalShell,windows用户再也不怕linux黑窗口不会用了:) * 支持直接命令行; ...

  2. 《Head First 设计模式》:组合模式

    正文 一.定义 组合模式允许你将对象合成树形结构来表现"整体/部分"层次结构.组合能让客户以一致的方式处理组合对象以及个体对象. 组合对象:包含其他组件的组件. 个体对象(叶节点对 ...

  3. C Primer Plus 学习笔记

    随笔: 1)C语言中%3d%2d什么意思? 格式化规定字符, 以"%"开始, 后跟一个或几个规定字符,用来确定输出内容格式.在"%"和字母之间插进数字表示最大场 ...

  4. oracle之SQL的基本函数

    SQL的基本函数 2.1 单行函数与多行函数 单行函数:指一行数据输入,返回一个值的函数.所以查询一个表时,对选择的每一行数据都返回一个结果. SQL>select empno,lower(en ...

  5. CEO的行为风格会影响公司业绩吗?

    中国的两大互联网巨头--腾讯和阿里,创始人的风格非常不同.在公众面前,马云的形象是高谈阔论,而马化腾则显得较为低调.在公司管理上,马云不插手具体事务,而是站在高处务虚,抓战略.抓文化,而马化腾则是腾讯 ...

  6. 接口、RESTful规范、DRF

    接口 #接口:url连接,通过向链接发送不同的类型请求与参数得到相应的响应数据 #1.在视图书写处理请求的 视图函数 #2.在路由层为视图函数配置 url链接=>产生接口 #3.前台通过ajax ...

  7. Salesforce Javascript(一) Promise 浅谈

    本篇参看: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise https ...

  8. if-else​ 条件语句

    1.  条件语句模型 Go里的流程控制方法还是挺丰富,整理了下有如下这么多种: if - else 条件语句 switch - case 选择语句 for - range 循环语句 goto 无条件跳 ...

  9. (最新 9000 字 )Spring Boot 配置特性解析

    爱生活,爱编码,微信搜一搜[架构技术专栏]关注这个喜欢分享的地方.本文 架构技术专栏 已收录,有各种JVM.多线程.源码视频.资料以及技术文章等你来拿 一.概述 目前Spring Boot版本: 2. ...

  10. 基于SpringBoot+SpringDataJpa后台管理

    昨天朋友找我喝酒,说30岁了,比较焦虑,钱没赚到,整天被媳妇数落. 其实现在我们看到的不一定就事真实的情况,就算从高斯分布看,平平淡淡的人生才是大部分人的轨迹.当然抖音.知乎上的不能比,人均收入百万, ...