Python类中公开方法、私有方法和特殊方法的继承原理
在Python中,对象的私有成员在类外部、派生类或程序中无法直接访问,但是可以通过“对象名._类名__私有成员名”这样一种特殊的形式来访问。
基类的构造方法和公开方法可以在类的外部直接访问,也可以被派生类继承。
在访问对象成员时,如果不存在则按照派生顺序逆序查找其基类中是否存在该成员,如果都不存在则抛出异常。
>>> class A(object):
#构造方法可能会被派生类继承
def __init__(self):
self.__private()
self.public()
#私有方法在派生类中不能直接访问
def __private(self):
print('__private() method in A')
#公开方法在派生类中可以直接访问,也可以被覆盖
def public(self):
print('public() method in A')
#类B没有构造方法,会继承基类的构造方法
>>> class B(A):
#这不会覆盖基类的私有方法
def __private(self):
print('__private() method in B')
#覆盖了继承自A类的公开方法public
def public(self):
print('public() method in B')
#自动调用基类A构造方法
>>> b = B()
__private() method in A
public() method in B
#基类和派生类的私有方法访问方式不一样
>>> dir(b)
['_A__private', '_B__private', '__class__', ...]
>>> class C(A):
#显式定义构造函数
def __init__(self):
#这里调用的是类C的私有方法
self.__private()
self.public()
def __private(self):
print('__private() method in C')
def public(self):
print('public() method in C')
#自动调用类C的构造方法
>>> c = C()
__private() method in C
public() method in C
>>> dir(c)
['_A__private', '_C__private', '__class__', ...]
由于这个内容对于理解Python的继承机制很重要,在《Python程序设计基础》、《Python程序设计(第2版)》和《Python可以这样学》这几本书中都提到了,可能是书上的注释少了点,很多朋友还是看不明白,故发此文补充些注释来帮助理解。
另外,Python中的类还有大量特殊方法,详见Python对象特殊方法及其用法演示,在创建派生类时,基类中已经实现的特殊方法可以被派生类继承。
>>> class A:
def __init__(self, value):
self.__value = value
def __add__(self, value):
return A(self.__value+value)
def __repr__(self):
return repr(self.__value)
>>> class B(A):
pass
>>> b = B(3)
>>> b + 5
8
Python类中公开方法、私有方法和特殊方法的继承原理相关推荐
- python 类 公有属性、私有属性、公有方法、私有方法
python 类 公有属性.私有属性.公有方法.私有方法 #!/usr/bin/env python # -*- encoding: utf-8 -*- """ @Int ...
- 第8.12节 Python类中使用__dict__定义实例变量和方法
上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...
- python私有函数实现_024孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘...
(完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天发现了python的类中隐藏着一些特殊的私有方法. 这些私有方法不管我们定义类时是否在类的内部代码块中定义过它们,这些私有方法都是存在的.比 ...
- python类中包含一个特殊的变量、它可以访问类的成员_Python 类的特殊成员介绍...
类的成员有两种形式 公有成员,在任何地方都能访问 私有成员,只有在类的内部才能方法,私有成员命名时,前两个字符是下划线. class Foo: def __init__(self, name, age ...
- python定义私有变量的方法_Python怎么修改私有属性 如何访问python类中的私有方法...
python 类为什么不能定义私有属性和方法 因为b.name[0] = 'zhang'修改的是类属性,类属性是全局的,所有的实例共享,如果想私有化,可以添加 def __init__( self ) ...
- Python类中的私有属性和私有方法
Python类中的私有属性和私有方法 Python是面向对象的语言,在Python里一切皆对象,所以大部分情况下,我们都是通过类的方式来编程. 但是Python中的属性和方法在类的外部默认是可以访问的 ...
- python类中私有成员和方法的访问
1.私有成员的访问 python类中的私有成员和方法内的私有成员(在python中以__开头的变量),在类外只能通过类中定义的方法来进行访问,或者用一种特殊的方式a._A__value(a是对象,A是 ...
- python类中的属性分为类属性和实例属性两种_python从入门到大神---1、初始化实例、类属性、方法...
python从入门到大神---1.初始化实例.类属性.方法 一.总结 一句话总结: 方法不加括号是代码段:感觉python方法和js,php很类似,不加括号是代码段,加括号变成方法,比如f,f() 1 ...
- 用生动的例子花式解释:python类中一定需要有 __init__方法么?没有会怎样?
python 类中一定需要有 __init __方法么?没有的会怎样? 在回答这个问题之前,先说两个问题: ① 面向对象编程? ② 什么是类? 面向对象,先上一个正式点的解释: "把一组数据 ...
最新文章
- mysql子查询复杂操作_MySQL 子查询操作
- 数组公式基本功修炼之数组公式解读
- python数组不同地方
- 计算机原理与基础 —— (皇帝身边的小太监----寄存器)
- 回文字符串啊~---太搞了 少年 DXH
- nova7修屏逛校园2021-07-07
- RaabitMQ:rabbitmqctl的几个命令
- WordPress主题modown6.2+erphpdown11.7
- Cookie、Session、Token、JWT区别与联系
- zabbix邮件脚本报警
- [转载] python oct_Python oct()
- 2021【第十二届蓝桥杯省赛】 C/C++ B组(第一场)
- java求解一给定数字的二进制表达中的1的个数
- 怎么看vray渲染进度_超详细Vray渲染器渲染面板认知图文教程!小白也能一目了然,看不懂你来找我...
- sqlplus命令支持上、下翻功能
- GeoTools入门(八)-- (SLD)样式处理
- 数据库课程设计------书店管理系统
- 《大数据之路-阿里巴巴大数据实践》读书笔记
- 【经验分享】调试STM32F107VC单片机驱动DP83848以太网PHY芯片时遇到的问题
- Mac安装Java反编译工具JD-GUI(解决打不开问题)
热门文章
- python面向对象的特征_03 Python 关键点讲解:面向对象的机制
- 网络启动安装linux客户机nfs设置,NFS服务端和客户端安装配置
- android 代码水印,Android实现为图片添加水印
- php laravel导入excel,Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
- 2019mysql安装_2019mysql安装过程
- 硬盘读写测试工具_硬盘测速工具:Blackmagic Disk Speed Test Mac
- spring mvc和rest风格小例子
- java fragment_初步认识Fragment 之一 编写简单的fragment代码
- 基于JAVA+SpringMVC+Mybatis+MYSQL的体育场地预约管理系统
- 基于JAVA+Servlet+JSP+MYSQL的网络考试系统