Python面向对象的特征跟私有属性
面向对象的三大特征
继成、封装、多态:
继承:一个类可以继承一个或多个类,被继承的类叫做父类,继承的类叫做子类
封装:将数据和方法放在了一个类中就构成了封装
多态:指的一类事物有多重形态,一个抽象类有多个子类,不同的子类对象调用相同的
方法,产生不同的执行结果,多态可以增加代码的灵活度
注意:python 中函数的参数没有类型限制 Python严格意义上来讲没有多态,只是伪多态
鸭子类型的提现:
静态语言:对于静态语言(java、C#)来讲上面传入的对象必须是Base类型或者它的子类,否则
将无法调用run 方法
动态语言:对于动态语言Python来讲,上面传入的并不一定是base类型,也可以是其他类型,只要
再内部实现一个run()方法就行了,这就是鸭子类型的提现。
多态的意义:开放封闭原则
1.多个变量,我们只需要知道它是Base类型,无需确切地知道它的子类型,就可以放心的调用子类方法
2.当需要新增功能,只需要新增一个base的子类实现run方法,就可以在原来的基础上进行扩展,这就是
著名的开放封闭原则。
3.对扩展开放:允许新增base 子类
4.对修改封闭:不需要修改依赖base类型的run()函数
私有属性
1.类里面定义的变量叫类属性,那么类属性有两种,分为:公有属性和私有属性
私有属性的定义:
单下划线开头:_attr
双划线开头:__attr 注意:双下划线的开头的私有属性,对外不能直接访问,(它的名字被改变了,
在原有的属性名前面加了一个 _类名)
** 私有属性在类里面也可以被继承。私有属性也可以被类跟实例调用
Python并没有真正的私有化支持,但可用下划线得到伪私有,有一项大多数Python代码都遵循的习惯:
带有下划线,前缀的名称应被视为非公开的API的一部分,它应被视为实现细节,如有更改,恕不另行通知。
2.__dict__
类调用__dict__属性,返回类属性和方法的字典
实例调用__dict__属性,返回的值实例相关的属性和方法
注意:我们在创建类的时候,每一个类都会创建一个__dict__ 属性,这样会非常耗费内存,
如果采用继承就不会再创建__dict__只会在父类创建__dict__(性能优化方面)
3.内置属性__slots__
默认情况下,类的实例有一个字典用于存储属性。这对于具有很少实例变量的对象会浪费内存空间
当创建大量实例时,空间消耗会变得尖锐。
可以通过在类定义中定义__slots__ 来覆盖默认__dict__行为。_slots__声明接受一个实例变量序列
并在每一个实例中只保留足够保存每个变量值的空间。因为没有为每个实例创建__dict__,所以节省空间
注意:__slots__ 这个属性不会被继承,只对当前的类生效
Python面向对象的特征跟私有属性的更多相关文章
- Python面向对象静态方法,类方法,属性方法
Python面向对象静态方法,类方法,属性方法 属性: 公有属性 (属于类,每个类一份) 普通属性 (属于对象,每个对象一份) 私有属性 (属于对象,跟普通属性相似,只是不能通过对象直接访问) 方法: ...
- Python面向对象三大特征
继承 面向对象中的继承就是继承的类直接拥有被继承类的属性而不需要在自己的类体中重新再写一遍,其中被继承的类叫做父类.基类,继承的类叫做派生类.子类.在python3中如果不指定继承哪个类,默认就会继承 ...
- Python笔记(十八)_私有属性、实例属性、类属性
私有属性 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,就变成了一个私有属性,只有内部可以访问,外部不能直接访问或修改. 这样就确保了外部代码不能随意修改对象内部的状态,这样通过 ...
- python面向对象的特征及反射
目录 派生类实操 面向对象特征之封装 property伪装属性(python内置装饰器) 面向对象特征之多态 面向对象之反射 派生类实操 1.将时间字典序列化成json格式,由于序列化数据类型的要求, ...
- Python面向对象基础:设置对象属性
用类存储数据 类实际上就是一个数据结构,对于python而言,它是一个类似于字典的结构.当根据类创建了对象之后,这个对象就有了一个数据结构,包含一些赋值了的属性.在这一点上,它和其它语言的struct ...
- python面向对象-2深入类的属性
在交互式环境中输入: >>> class A: a=0 def __init__(self): self.a=10 self.b=100 >>> a=A() > ...
- python 面向对象类成员(字段 方法 属性)
一.字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 普通字段属于对象 静态字段属于类 class Province: # 静态字段 countr ...
- python 面向对象(四)--实例属性和类属性
由于Python是动态语言,根据类创建的实例可以任意绑定属性. 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Student(object): def __init__(se ...
- python 面向对象静态方法、类方法、属性方法、类的特殊成员方法
静态方法:只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性. 在类中方法定义前添加@staticmethod,该方法就与类中的其他(属性,方法)没有关系,不能通过实例化类调用方法使用 ...
随机推荐
- 基于Swoole的HTTP/HTTPS代理
N行代码实现一个简单的代理服务器 <?php /** * Web代理服务器(支持http/https) * @author zhjx922 */ class WebProxyServer { p ...
- Leo2DNT(雷傲论坛转DiscuzNT)1.0转换程序发布
数据转换程序 雷傲论坛(Leobbs4.x) -> Discuz!NT V1.0 本转换程序基于Leobbs4.x设计 声明: 1.本程序只对数据作转换,不会对原来的雷傲论坛(数据 ...
- 解决vue页面刷新或者后退参数丢失的问题
原文链接: 点我 在商城类的项目中,会经常遇到列表数据筛选查询的情景,当要打开某一项的详情页或者暂时离开列表页,再返回(后退时),选择的筛选条件会全部丢失,辛辛苦苦选择好的条件全没了,还得重新选择,如 ...
- Codeforce-Ozon Tech Challenge 2020-D. Kuroni and the Celebration(交互题+DFS)
After getting AC after 13 Time Limit Exceeded verdicts on a geometry problem, Kuroni went to an Ital ...
- POJ - 2251 Dungeon Master(搜索)
You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of un ...
- python(索引/切片)
一.索引 1.索引值从左到右-->从0开始,索引值从右到左-->从-1开始 取值格式var[index] >>> name = "xinfangshuo&quo ...
- Redis 学习笔记(一) 字符串 SDS
SDS 简单动态字符串. SDS的结构: struct sdshdr{ int len;//记录BUF数组中已使用字节的数量 ,等于SDS所八寸字符串的长度 int free;//记录BUF数组中未使 ...
- 【Spark】通过创建DataFrame读取不同类型文件内容
文章目录 读取文本文件 第一种方法:通过RDD配合case class转换DataFrame 步骤 一.创建测试所需的文本文件 二.在spark-shell中执行以下操作 第二种方法:通过sparkS ...
- [whu1564]后缀数组
http://acm.whu.edu.cn/land/problem/detail?problem_id=1564 思路:先把串复制一遍,在末尾补个标记,后缀数组跑一下,扫一遍就ok了(过滤后缀在后半 ...
- SQL 选择列 IF表达式,Contains表达式的用法
因为业务需要需要使用到, 列中的字段或根据列值是否满足某一条件,进行输出.比如类似与 select if() ……from……:(但是SQL Server 没有 if 表达式) 比如,如果Scor ...