python面向对象中容易忘记的——私有化的属性和方法
Posted 神的孩子都在歌唱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python面向对象中容易忘记的——私有化的属性和方法相关的知识,希望对你有一定的参考价值。
前言:
作者:神的孩子在歌唱
这是我听老师讲课做的笔记
大家好,我叫陈运智,大家可以叫我智,我创建了一个python,机器学习交流群903419026
,各位大佬小白可以进来多交流交流,互相促进。我的微信(记得备注csdn):chenyunzhiLBP
私有化属性和方法
目的:通过声明私有化属性、方法,保护和控制数据,使无法直接通过类名修改类属性
一. 私有化属性
-
定义:为了更好的保存属性安全,即不能随意修改,将属性定义为私有属性,添加一个可调用的方法去访问。
-
作用:私有属性不能被子类和外部继承和访问,只能在内部访问和使用
-
使用:在属性名前加__就变成了私有属性
-
代码事列:
class Person(object):
__age=18#定义一个私有类属性前面加两个下划线
def get_age(self):#访问私有类属性
return Person.__age
def set_age(self,age):#修改
Person.__age=age
chen=Person()
(1)私有化属性可以在类里面访问(get_age
),修改(set_age
)。定义两个实例进行访问和修改
print(chen.get_age())
chen.set_age(20)#修改私有类属性
print(chen.get_age())
输出:
18
20
(2) 私有化属性不能再类外面访问
print(Person.__age)#类对象无法访问私有类属性
print(chen.__age)#实例对象无法访问私有属性
会报错
(3)子类不能继承私有化属性。
具体的子类父类问题可以看这篇文章python必学的面向对象基础之继承静态与多态
#定义一个子类
class China(Person):
def get_age(self):
print(self.__age)#尝试访问父类的私有化属性
yun=China()
yun.get_age()
报错异常:
1.1 Property属性
-
目的:就是你定义了私有属性,又如何通过高效的方法访问和修改私有方法,让使用者感到用的是个属性,不是方法
-
用法:在方法上使用装饰器
@property
和@age.setter
,相当于上面的get
和set
方法
class Person(object):
def __init__(self):
self.__age=18#定义一个私有类属性
@property#使用装饰器对age进行装饰,提供一个getter方法,可以访问私有类属性
def age(self):#访问实例属性
return self.__age
@age.setter #使用装饰器进行装饰,提供一个setter方法修改私有类属性
def age(self,age):#修改私有类属性
if age<0:
print('年龄不小于0')
else:
self.__age=age
chen=Person()#定义对象
chen.age=15#修改私有类属性
print(chen.age)#访问私有类属性
输出:
15
二. 私有化方法
跟私有化属性差不多,不能直接调用,可以再内部调用
-
作用:不允许外部调用,防止子类意外重写,把普通的方法设置成私有化方法。
-
代码事列:
class Animal:
## 在方法前面加两个 __ 下划线,变成私有化方法
def __eat(self):
print('吃东西')
pass
# 普通方法
def run(self):
self.__eat() #在此调用私有化的方法
print('飞快的跑')
pass
b1=Bird()
(1)直接调用eat
b1.eat()# 调用私有化方法,报错
报错
(2)调用run
b1.run()# 正常调用
#输出:
#吃东西
#飞快的跑
本人博客:https://blog.csdn.net/weixin_46654114
本人b站求关注:https://space.bilibili.com/391105864
转载说明:跟我说明,务必注明来源,附带本人博客连接。
请给我点个赞鼓励我吧
以上是关于python面向对象中容易忘记的——私有化的属性和方法的主要内容,如果未能解决你的问题,请参考以下文章