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,该方法就与类中的其他(属性,方法)没有关系,不能通过实例化类调用方法使用 ...
随机推荐
- Eclipse新建类的时候如何自动添加注释(作者,时间,版本等信息)
为什么80%的码农都做不了架构师?>>> 方法一:Eclipse中设置在创建新类时自动生成注释 windows–>preference Java–>Code Sty ...
- 两种方法直接删除数组中特定值的项(JavaScript)
一.问题详情: 直接删除意为原数组需要被改变,而不是得到另一个数组. 二.JavaScript实现 (一)巧用数组的push( ).shift( )方法 function del(arr,num) { ...
- 面试中的volatile关键字
在Java的面试当中,面试官最爱问的就是volatile关键字相关的内容.经过多次面试之后,你是否思考过,为什么他们那么爱问volatile关键字相关的问题?而对于你,如果作为面试官,是否也会考虑采用 ...
- nginx判定国家ip访问网站
我们可以通过GeoIP模块和MaxMind免费数据库来实现.MaxMind具有新版本的数据库GeoLite2,它仅支持CSV和mmdb格式.可以支持mngx_http_geoip2_modulemdb ...
- C# 9.0 新特性预览 - 类型推导的 new
C# 9.0 新特性预览 - 类型推导的 new 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大 ...
- 如何将PHP7达到最高性能
PHP7 VS PHP5.6 1. Opcache 记得启用Zend Opcache, 因为PHP7即使不启用Opcache速度也比PHP-5.6启用了Opcache快, 所以之前测试时期就发生了有人 ...
- Linux软件安装和维护
rpm 早期 redhat package manager 现在 rpm package manager rpm安装的格式: 软件名称-版本号-适用平台.rpm jdk -8u151 -linux-x ...
- 在web中使用shiro(会话管理,登出,shiro标签库的使用)
在shiro的主配置文件中配置,登出的请求经过的过滤器就可以了,在shiro的过滤器中有一个名称为logout的过滤 器专门为我们处理登出请求: 一.shiro会话管理器 shiro中也提供了类似于w ...
- Coursera课程笔记----计算导论与C语言基础----Week 11
C程序中的字符串(Week 11) 字符数组 所有的字符串,都是以\0结尾的 只能在数组定义并初始化的时候:char c[6] = "China"; 不能用赋值语句将一个字符串常量 ...
- for do-while while区别
分别用for do-while while求1-100的和