python 类与对象解析
类成员:
# 字段
- 普通字段,保存在对象中,执行只能通过对象访问
- 静态字段,保存在类中, 执行 可以通过对象访问 也可以通过类访问
# 方法
- 普通方法,保存在类中,由对象来调用,self=》对象
- 静态方法,保存在类中,由类直接调用,对象也可以调用
- 类方法,保存在类中,由类直接调用,cls=》当前类,对象也可以调用
class Foo:
nation = 'china'# 静态字段
def __init__(self, name):
self.name = name # 普通字段 def show(self): # 普通方法
print(self.name) @staticmethod # 静态方法
def stat(a1,a2):
print(a1,a2) @classmethod # 类方法
def classmd(cls):# cls 是类名
print(cls)
print('classmd') obj = Foo('pis')
obj.name
obj.show()
#Foo.show(obj)#也能成功调用,传入对象参数
Foo.stat(1,2)#类直接调用
Foo.classmd()#类直接调用
obj.stat(1,2) #对象直接调用
obj.classmd()#对象直接调用
python并没有真正的私有属性(c++有public protect private)
实际上:用__定义的属性,只是被改名换姓而已。
用_定义的属性,意义在于唤起用户的注意,看成私有属性.实际上只是普通方法。
表现形式:双下划线的函数或属性,在类定义中(类中方法)可以调用和访问,类的实例不可以直接访问,子类不可访问。
单下划线的函数或属性,在类定义中(类中方法)可以调用和访问,类的实例可以直接访问,子类中可以访问;
对于双下划线的函数或属性,Python解释器使用了名字混淆的方法, 将私有的方法"__method"变成了"_classname__method"了。
class Base(object):#object 为基类,有一些常用的方法
def __private(self):
print("private value in Base") def _Base__private(self):
print("_Base__private value in Base")#如果没有定义,则调用上一方法 def _protected(self): #已被覆盖
print("protected value in Base") def public(self):
print("public value in Base")
self.__private()
"""此时调用父类的方法-----------原因如下:
self.__private()方法调用时先从子类寻找,再从父类寻找,没有则报错。
如果是子类的普通方法调用,虽然子类的私有方法已改名,但能识别,而调用子类的私有方法。
现在父类的public调用,而子类的私有方法已改名,不能识别。
父类的public方法只能寻找并调用父类的__private()方法。
我们知道子类的普通方法能够调用子类的私有方法(虽然已改名),父类也是。所以能够找到父类的私有方法。
那么父类的私有方法改名了吗?我们加入代码测试------已改
"""
self._protected()#已被覆盖 class Derived(Base):
def __private(self):
print("override private") def _protected(self):
print("override protected") d = Derived() #创建对象
d.public() #继承父类的方法
d._protected()#调用子类的方法
d._Derived__private()#调用子类__private(),不推荐使用。不符合初衷。 #d.__private()#已改名,不能调用。父类就算有相同方法根本看不到。
结果如下:
public value in Base
_Base__private value in Base
override protected
override protected
override private
1. 多重继承时方法查找顺序如何呢?
类都有一个名为 __mro__ 的属性, 它的值是一个元组, 按照方法解析顺序列出各个超类, 从当前类一直向上, 直到object 类。 D 类的 __mro__ 属性如下 :
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
通俗点也就是三大原则:a. 左侧优先
b. 一条道走到黑
c. 同一个根时,根最后执行
2. 单继承和多继承中构造函数__init__
单继承情况
(1)子类默认无__init__时,则会直接继承父类__init__
(2)子类中含有__init__时,不会自动调用父类__init__,如需使用父类__init__中的变量,则需要在子类__init__中显式调用
多继承情况
(1)子类继承于多个父类,并且子类无__init__时,则按继承顺序(MRO),哪个父类在最前面且有自己的__init__,则继承它;若最前面的父类无__init__,则继承第二个父类的__init__,若还是无__init__,则依次往后寻找,直到继承的某个父类含__init__。
(2)子类继承于多个父类,并且子类含__init__时,和单继承的(2)类似,不会自动调用所有父类__init__,如需使用某个父类__init__中的变量,则需要在子类__init__中显式调用
python 类与对象解析的更多相关文章
- python类与对象各个算数运算魔法方法总结
1.python类与对象各个算术运算魔法方法总结: 2.各个魔法方法应用举例: 3.实例训练: (1)我们都知道在 Python 中,两个字符串相加会自动拼接字符串,但遗憾的是两个字符串相减却抛出异常 ...
- python 类和对象的属性
python类和对象的属性分为类属性和对象属性两大类,类属性属于类,而对象属性属于对象. 1. 父类的对象属性会被子类的对象继承. 2. 父类的类属性会被子类继承,还是作为类属性,如果父类改变了类属性 ...
- 一文讲全了Python 类和对象内容
摘要:这是一个关于 Python 类和对象的全部内容. 本文分享自华为云社区<从零开始学python | Python 类和对象-面向对象编程>,原文作者:Yuchuan . Pytho ...
- python类、对象
python类.对象 学习完本篇,你将会深入掌握 什么是类,对象 了解类和对象之间的关系 能独立创建一个People(人类),属性有姓名.性别.年龄.提供一个有参的构造方法,编写一个show方法,输出 ...
- python 类和对象
类和对象 类 1.类的组成 数据和函数,二者是类的属性 2.两个作用: 实例化 属性引用 属性引用:类名.属性(增删改查) 实例化: 类名加括号就是实例化,会自动出发__init__的运行 ...
- Python类和对象
目录 类与对象 其他方法 继承 经典类和新式类 派生 组合 接口.归一化设计与抽象类 继承实现的原理 子类中调用父类的方法 指名道姓 super()方法 多态与多态性 封装 单下划线开头 双下划线开头 ...
- python 类、对象、方法、属性
在python中,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) 结论:对象=属性+方法 在python中,把具有相同属性和方法的对象归为一个类(class) ...
- python类、对象、方法、属性之类与对象笔记
python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性(特征)和行为来描述一个对象的.比如家里的小狗, ...
- python类与对象基本语法
面向对象编程的2个非常重要的概念:类和对象. 对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念--类. 类就相当于制造飞机时的图纸,用它 ...
随机推荐
- Daily Scrum 1 --团队项目所需时间估计以及任务分配
考虑到所有的任务不可能逐一细化分配给成员,我们将需要完成的任务进行了大致的分配.任务所需要的具体实现可以参看<学霸网站NABC> 所需要的总时间一共为44h. 我们会在以后的每日任务中进行 ...
- android学习-2 (AVD 创建)
在Android studio的tools下选择AVD manager 按照指示选择相应的硬件和系统映像. 在模拟器中运行应用 选择RUN APP 选择RUN时,并不只运行应用,还会处理运行应用所需要 ...
- Tuscany glossary of terms
SOA(service-oriented architecture) 面向服务的架构 解决问题:面向服务.多语言.多种数据格式.多协议 SCA(Service Component Architectu ...
- express框架结合ejs模板引擎使用
我们在项目里建立一个views文件夹(必须),如果你不想使用views文件夹的话需要调用app.set("views","自定义文件夹名"),然后在里面建立一个 ...
- Hadoop到底能做什么?怎么用hadoop?
hadoop是什么?(1)Hadoop是一个开源的框架,可编写和运行分布式应用处理大规模数据,是专为离线和大规模数据分析而设计的,并不适合那种对几个记录随机读写的在线事务处理模式.Hadoop=HDF ...
- 转 C#高性能Socket服务器SocketAsyncEventArgs的实现(IOCP)
原创性申明 本文作者:小竹zz 博客地址:http://blog.csdn.net/zhujunxxxxx/article/details/43573879转载请注明出处引言 我一直在探寻一个高性能 ...
- Vue2.0组件之间通信(转载)
Vue中组件这个特性让不少前端er非常喜欢,我自己也是其中之一,它让前端的组件式开发更加合理和简单.笔者之前有写过一篇Vue2.0子父组件通信,这次我们就来聊一聊平级组件之间的通信. 首先我们先搭好开 ...
- Mysql Group Replication 简介及单主模式组复制配置【转】
一 Mysql Group Replication简介 Mysql Group Replication(MGR)是一个全新的高可用和高扩张的MySQL集群服务. 高一致性,基于原生复制及p ...
- linux_添加定时任务,每5min清理下某个文件夹下的文件
性能测试的过程中会生成大量的日志文件,导致无法继续进行,linux可以增加一个定时任务,进行定时清理 1. 先编写一个sh脚本,该sh脚本用于文件夹文件清理,脚本编写完成后拷贝到服务器上,且授予权限 ...
- Qt宏Q_OBJECT展开记录
c++中的宏 #define A 3.14 展开后把A替换为B #define A(a) #a 展开后用a的字符串替换A(a) #define A(a) a##B 展开后把a和B的字符串连接起来后替换 ...