python支持保护类型_1.7. 保护、继承、多态
# 1.7. 保护、继承、多态
## 1.私有对象和属性:
1. Python中没有像C++中public和private这些关键字来定义公有和私有属性方法
2. 它是以属性命名的方法来区分,如果在属性名前面加上2个下滑线```__```表示表示这是私有属性,否则为公有属性,方法也是类似的
示例:
class Msg:
def __init__(self,money):
# 私有属性
self.__money=money
def getMoney(self):
return self.__money
#私有方法
def __sendMsg(self):
print("---正在发送短信--")
def sendMsg(self):
if(self.getMoney()>100):
self.__sendMsg()
else:
print("余额不足")
msg=Msg(1000)
print(msg.getMoney())
msg.sendMsg()
结果是:```1000
---正在发送短信--```
## 2.```__del()__```方法
创建对象后,python解释器默认调用__init__()方法;
当删除一个对象时,python解释器也会默认调用一个方法,这个方法为__del__()方法
* 当有1个变量保存了对象的引用时,此对象的引用计数就会加1
* 当使用del删除变量指向的对象时,如果对象的引用计数不为1,比如3,那么此时只会让这个引用计数减1,即变为2,当再次调用del时,变为1,如果再调用1次del,此时会真的把对象进行删除
示例1,删除一个,留一个:
class Dog:
def __del__(self):
print("over")
dog=Dog()
dog1=dog
del dog
print("=======")
结果是:
=======
over
示例2,删除完:
class Dog:
def __del__(self):
print("over")
dog=Dog()
dog1=dog
del dog
del dog1
print("=======")
结果是:
over
=======
### 测量对象引用个数
需要引入sys模块,并用sys.getrefcount(对象),它所测出来的个数要比实际个数多一个,因为调用的时候传了参数,增加了一个。
import sys
class Dog:
def __del__(self):
print("over")
dog=Dog()
dog1=dog
print(sys.getrefcount(dog))
del dog
print(sys.getrefcount(dog1))
del dog1
print(sys.getrefcount(dog1))
结果是:
3
2
over
Traceback (most recent call last):
File "/home/shushu/PycharmProjects/pylearn35/del方法.py", line 12, in
print(sys.getrefcount(dog1))
NameError: name 'dog1' is not defined
最后一行检测的时候已经没有了,所以会报错
## 3.继承
示例:
# 定义一个父类,如下:
class Cat(object):
def __init__(self, name, color="白色"):
self.name = name
self.color = color
def run(self):
print("%s--在跑"%self.name)
# 定义一个子类,继承Cat类如下:
class Bosi(Cat):
def setNewName(self, newName):
self.name = newName
def eat(self):
print("%s--在吃"%self.name)
bs = Bosi("印度猫")
print('bs的名字为:%s'%bs.name)
print('bs的颜色为:%s'%bs.color)
bs.eat()
bs.setNewName('波斯')
bs.run()
结果是:
bs的名字为:印度猫
bs的颜色为:白色
印度猫--在吃
波斯--在跑
* 子类可以会默认执行父类的```__init__```方法
* 子类在继承的时候,在定义类的时候,小括号()为父类的名字
* 父类的属性,和方法会继承给子类
**注意**
* 私有的属性,不能通过对象直接访问,但是可以通过方法访问
* 私有的方法,不能通过对象直接访问
* **私有的属性、方法,不会被子类继承,也不能被访问,只有父类提供了访问私有属性和方法的方法,子类通过该方法去访问私有属性和方法**
* 一般情况下,私有的属性、方法都是不对外公布的,往往用来做内部的事情,起到安全的作用
### 重写
所谓重写,就是子类中,有一个和父类相同名字的方法,在子类中的方法会覆盖掉父类中同名的方法
调用父类的方法:
class Cat(object):
def sayHello(self):
print("halou-----1")
class Bosi(Cat):
def sayHello(self):
print("halou-----2")
#第一种调用父类的方法
Cat.sayHello(self)
#第二种调用父类的方法
super().sayHello()
a=Bosi();
a.sayHello()
结果是:
halou-----2
halou-----1
halou-----1
## 4.多继承
多继承时,相同方法调用顺序可以通过```对象.__mro__```来查看
class base(object):
def test(self):
print('----base test----')
class A(base):
def test(self):
print('----A test----')
# 定义一个父类
class B(base):
def test(self):
print('----B test----')
# 定义一个子类,继承自A、B
class C(A,B):
pass
obj_C = C()
obj_C.test()
print(C.__mro__) #可以查看C类的对象搜索方法时的先后顺序
结果是:
----A test----
(, , , , )
## 5.多态
class Dog(object):
def print_self(self):
print("Dog")
class Xiaotq(Dog):
def print_self(self):
print("Xiaotq")
def introduce(temp):
temp.print_self()
dog=Dog()
xiaotq=Xiaotq()
introduce(dog)
introduce(xiaotq)
## 6.类属性、实例属性
class Dog(object):
age=0
__name="tom"
def __init__(self,color):
self.color=color
dog=Dog("白")
print(dog.age)
print(Dog.age)
# print(Dog.__name) 不能调用私有属性
print(dog.color)
print("---------------------")
dog.age=1#设置与类属性相同的属性
print(dog.age)#实例属性会屏蔽掉类的属性
print(Dog.age)#但原来类的属性值并不会发生改变
print("---------------------")
Dog.age=1#用类可以去修改类属性,类属性会发生改变
print(dog.age)
print(Dog.age)
print("---------------------")
del dog.age
print(dog.age)
print(Dog.age)
结果是:
0
0
白
---------------------
1
0
---------------------
1
1
---------------------
1
1
## 7.类方法、静态方法、
class Dog(object):
age=0
__name="tom"
def __init__(self,color):
self.color=color
#类方法是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数
@classmethod
def addAge(cls):
cls.age+=10
#静态方法需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数
@staticmethod
def msg():
print("+---------+")
print("| Dog |")
print("+---------+")
dog=Dog("白")
Dog.msg()
dog.msg()
print("------------------------")
dog.addAge()
print(dog.age)
print(Dog.age)
print("------------------------")
Dog.addAge()
print(dog.age)
print(Dog.age)
结果是:
+---------+
| Dog |
+---------+
+---------+
| Dog |
+---------+
------------------------
10
10
------------------------
20
20
python支持保护类型_1.7. 保护、继承、多态相关推荐
- python分数类_利用标准库fractions模块让Python支持分数类型的方法详解
前言 你可能不需要经常处理分数,但当你需要时,Python的Fraction类会给你很大的帮助.本文将给大家详细介绍关于利用标准库fractions模块让Python支持分数类型的相关内容,分享出来供 ...
- python支持复数类型以下说法错误的是,Python支持复数类型,以下哪个说法是错误的?...
Python支持复数类型,以下哪个说法是错误的? 答:虚部后缀j必须是小写形式 特性曲线是实验测定的 答:对 公元前7世纪末,罗马国王塞尔维乌斯 · 图里乌斯用以财产为基础公民兵取代了氏族武装,从而将 ...
- python支持复数类型以下什么说法是错误的,【Python】专项练习题(1)
1.python代码如下: foo = [1,2] foo1 = foo foo.append(3) A.foo 值为[1,2] B.foo 值为[1,2,3] C.foo1 值为[1,2] D.fo ...
- python支持复数类型以下什么说法是错误的_python测试开发面试题1
自动化面试试题1 试卷时间 60分钟,请不要在试卷上作答,用A4纸做答题纸作答. 一,中文单项选择题(30分,每个3分) 1.下列哪个语句在Python中是非法的? A.x = y = z = 1 ...
- python支持list类型吗_Python Numpy不支持的操作数类型“list”“list”
编辑答案: 初始列表的元素是列表.这些列表的长度不同,因此强制转换为NumPy数组将生成dtype对象的数组,即数组的元素是列表.请看这里:https://stackoverflow.com/a/33 ...
- python支持字符类型吗_python核心数据类型 -- 字符串类型
说明 字符串字面量:把文本放入单引号/双引号/三引号中. 在python2中,str无法支持国际字符集,需要使用str = u"hello world" python2 使用uni ...
- python支持list类型吗_Python-不支持的操作数类型为%:“list”和“int”
我看了stackoverflow上的其他问题,但它们不同,似乎不适用于这个问题,所以这里. 我已经编写了一个简单的脚本,它可以打印出1-49之间的每个数字,并使用range函数将其放入一个列表中. 现 ...
- python 支持的数据库_1.16 Python的数据库支持 - Python 全栈
1.16.1. 什么是 PyMySQL? PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb. PyMySQL 遵循 Pytho ...
- python支持复数类型、以下说法错误的是_Python支持复数类型,以下哪个说法是错误的?...
[单选题]要想成为有创造力的人,最关键的是 [单选题]移植与借鉴思维是指 [单选题]以下哪项不是三星集团成功的因素: [单选题]要成为有创造力的人,应该 [单选题]容许误差是指在一定观测条件下( )绝 ...
最新文章
- 起薪2万的爬虫工程师, Python需要学到什么程度才可以就业?
- 1乘到100 python_python每日一练之如何计算你的应发奖金?
- 测试类图Head First 设计模式 (九) 迭代器与组合模式(Iterator Composite pattern) C++实现...
- 3.2 matlab用if语句实现选择结构
- 云服务器的主机名是否可以修改??
- iPhone 12明天凌晨发布,有望推动苹果市值超过2.2万亿美元
- 禅道 mysql 远程连接_远程访问禅道开源版数据库(基于docker)
- How AI Is Transforming Medical Imaging
- java自学路线图(超全超详细)
- 河北省人民检察院利用深信服桌面云办公,实现智慧检务
- 表格中计算机设置,如何在excel表格中设置下拉菜单?一招教你搞定!
- Echarts显示自定义标注点/地图map引导线
- 利用python做一个游戏主播_Python爬取2000万直播数据——看20万游戏主播能否月入100万...
- 零基础学习之万物皆可GAN学习路线
- truncate()函数
- 五分钟学GIS | BIM与三维GIS的融合
- 平安科技移动开发二队技术周报(第十二期)
- Opencv学习笔记 - 使用opencvsharp和决策树进行训练和预测
- 一例所有文件都打不开故障的数据恢复过程(转)
- dumpsys meminfo分析
热门文章
- java httpclient 采集_使用java HttpClient 与Web服务器交互 - elliott - 博客园
- Outlook可以收发Live Mail了
- 矛与盾的较量-南美洲巅峰对决
- 网络基础配置部署思路
- java po vo bo是什么以及_JAVA中(PO,VO,TO,BO,DAO,POJO)分别是指什么
- UVM-TLM机制解读
- Ubuntu22.04/22.10 网易云音乐打不开的正确解决方案
- 【经验分享】GPU 显存不足怎么办?
- python打开浏览器全屏_Python+Selenium自动化——浏览器启动自动全屏配置
- 内发光html,如何使用css3实现字体内发光效果(详解)