目录

前言:

1.添加特有属性/方法

示例1:添加特有属性

示例2:添加特有方法

2.私有属性/方法

(1)私有化示例

(2) 私有化属性/方法可以在类的内部使用

(3)强制访问私有化属性/方法

(4)@property装饰器去操作私有属性/方法

总结:


前言:

前面我们学了Python中的属性和方法的定义,但是这些属性和方法都是公有的,也就是说我定义单个或者多个实例对象,这些实例对象都共有这个类的属性和方法,同时还可以去访问这些属性和方法。(上一期链接Python进阶-----面向对象1.0(对象和类的介绍、定义)_Python欧尼酱的博客-CSDN博客)下面给个例子:

class People:ty='人类'def __init__(self,name,age,gander):self.name=nameself.age=ageself.gander=ganderdef fun(self):print('电话号码****')print(f'我的年龄{self.age}')a=People('Jack',15,'male')
print(a.ty)
print(a.name,a.age,a.gander)
a.fun()
#输出结果:人类
# Jack 15 male
# 电话号码****
# 我的年龄15

这里可以看出,这个实例对象的所有属性和方法都可以被访问到,这个类的属性和方法都是公开的,并不是特有的。

1.添加特有属性/方法

当我们建立了一个实例化对象之后,我们可以去手动添加在对象的属性和方法,这个添加之后的方法或者属性都是这个对象特有的,如果我们去建立另外一个对象,这个对象是不能访问上一个对象的特有属性或者方法。

示例1:添加特有属性

class People:def __init__(self, name, age, gander):self.name = nameself.age = ageself.gander = ganderdef fun(self):print('电话号码****')print(f'我的年龄{self.age}')
a = People('Jack', 15, 'male')
b=  People('Amy',16,'fmale')
a.father='Tom'
print(a.__dict__)
print(b.__dict__)
print(b.father)#报错:'People' object has no attribute 'father'
#输出结果:{'name': 'Jack', 'age': 15, 'gander': 'male', 'father': 'Tom'}
#         {'name': 'Amy', 'age': 16, 'gander': 'fmale'}

这里可以看到,我给对象a添加了father属性,然后通过__dict__方法去查看这些属性,对比与对象b发现多了一个father属性,那么这个属性就是对象a特有的属性,那么如果我去用对象b查询b.father 那么结果就会报错

示例2:添加特有方法

class People:def __init__(self, name, age, gander):self.name = nameself.age = ageself.gander = ganderdef fun(self):print('电话号码****')print(f'我的年龄{self.age}')
def specific():print('this is a specific function')
a = People('Jack', 15, 'male')
b= People('Amy',16,'fmale')
b.specific=specific
b.specific()
#a.specific() #报错:'People' object has no attribute 'specific'
#输出结果:this is a specific function
#可以通过以下的方法,查询到对象a和对象b支持的功能和方法,很显然就可以看出specific()方法是谁特有的
# print(dir(b))
# print(dir(a))

这里可以看出我给对象b添加了特有的方法specific(),所以对象b是可以去调用这个方法的,而对象a是不可以去调用的,否则就会报错

2.私有属性/方法

所谓的私有,也就是在所有数据中,特别设置了某一些数据不可查询,也就是加密的意思。在现实生活中,相关部门,例如医院,他们获取了我们个人信息,名字,性别,年龄,手机号,身份证号码等等,但是这些部门在一些平台的展示的时候不会吧全部信息给展示出来(例如年龄,身份证号码等等),而是说张某,李某等,这就是一种加密私有的过程。在Python类中把一些属性或者方法给加密(私有)化,让建立的实例对象无法访问这些属性或者方法,这就是一个私有化的过程。

 Python中私有化的定义:

实例对象__属性名/方法名

(也就是在属性名字或者方法名字的前面加上两个_(下划线)

作用功能:
前面以医院的例子说了,可以把一些信息加密私有化,起到保护作用,在Python也是一样的,都是起保护作用,不公开一些比较重要的信息

(1)私有化示例

示例1:属性私有化

class People:def __init__(self, name, age, gander):self.name = nameself.__age = age #这里把年龄信息给加密私有化self.gander = ganderdef __user_info(self): #这里吧方法给加密私有化print('电话号码****')print(f'我的年龄{self.age}')def fun(self):print('the user')
user=People('Jack',20,'male')
print(user.name) #输出结果:Jack
print(user.gander) #输出结果:male
print(user.__age) #报错: 'People' object has no attribute '__age'

这里我给age进行私有化,但是我输出照样按照__age 去输出,结果报错说这个属性不存在,这也说明这个属性是无法查询的

示例2:方法私有化

class People:def __init__(self, name, age, gander):self.name = nameself.__age = age #这里把年龄信息给加密私有化self.gander = ganderdef __user_info(self): #这里吧方法给加密私有化print('电话号码****')print(f'我的年龄{self.age}')def fun(self):print('the user')
user=People('Jack',20,'male')
user.fun() #输出结果:the user
user.__user_info() #报错:'People' object has no attribute '__user_info'

这里可以看出,__user_info() 私有化后是无法调用的,这样写的好处就是到时候我们学到面对对象的封装时,就可以把相关的信息进行私有化封装,避免重要信息泄露,提高保护性

(2) 私有化属性/方法可以在类的内部使用

在定义类的过程中,一些私有化属性或者方法可以在类的内部进行调用,而在外部的实例对象是不可以去访问调用的(例子在上面)。

示例:

class People:def __init__(self, name, age, gander):self.name = nameself.__age = age #这里把年龄信息给加密私有化self.gander = ganderdef __user_info(self): #这里吧方法给加密私有化print('电话号码****')print(f'我的年龄{self.__age}')def __fun(self):print('the user')def using(self):#在类的内部定义一个方法去调用私有化方法/属性self.__fun()self.__user_info()
a=People('John',22,'male') #外部的实例对象是无法调用私有化属性/方法的
a.using()
#输出结果:
# the user
# 电话号码****
# 我的年龄22

(3)强制访问私有化属性/方法

私有化了相关属性/方法之后,难道就无法访问了吗?那当然不是了,如果真的无法访问那与其去私有化,那还干脆不如不写,其实Python中是可以通过一些方法去强制访问私有化属性或者方法的。那这样做其实是比较考验程序员的道德水平的哈,一般情况下我们虽然可以通过一些渠道去访问一些信息,但是真的没这个必要,这对其他人不好,所以在以后工作和生活的时候很不建议去强制访问相关重要信息。回归话题,现在是在学习Python嘛,哪有什么重要信息嘛,所以这些方法还是要学习的

通过dir()可以去查询到一个对象可以支持的方法,这里可以看出这里前面两个有_People__的方法,其实我们就可以去通过这个方法来查询使用一些私有化数据或者方法。

格式:

实例对象_类名__属性/方法

实例:

class People:def __init__(self, name, age, gander):self.name = nameself.__age = age #这里把年龄信息给加密私有化self.gander = ganderdef __user_info(self): #这里吧方法给加密私有化print('电话号码****')print(f'我的年龄{self.__age}')def fun(self):print('the user')
user=People('Tom',20,'male')
print(user._People__age) #强制访问属性
user._People__user_info()  #强制访问方法
#输出结果:20
#       电话号码****
#       我的年龄20

(4)@property装饰器去操作私有属性/方法

@property装饰器可以去实现将一个方法变成属性,这个属性但是又不完全是属性,这个转换之后的属性是具有方法的效果。这样可以提供操作效率,可以让操作者明显感觉得到正在操作的不是一个方法而是一个属性。

用法:

Python中提供了@property 获取方法的返回值属性,@方法名.setter 设置方法返回的属性值,@方法名.deleter 删除方法中的返回值

示例:

class Test:def __init__(self,score):self.__score=score@property #装饰器把下面这个方法转换为一个具有方法效果的属性def getscore(self): #定义一个方法if self.__score>=60:return f'及格,分数为{self.__score}'return '不及格'
Tom=Test(50)
print(Tom.getscore)

这里的初始化score是50分,然后返回的是不及格,但是如果我们想去修改或者删除这个分数的话,我们就要用到@getscore.setter和@getscore.deleter装饰器方法

class Test:def __init__(self,score):self.__score=score@property #装饰器把下面这个方法转换为一个具有方法效果的属性def getscore(self): #定义一个方法if self.__score>=60:return f'及格,分数为{self.__score}'return '不及格'@getscore.setterdef setscore(self,newscore):print('分数已修改')self.__score=newscore@getscore.deleterdef delscore(self):print('分数已删除')del self.__score
Tom=Test(50)
#触发property装饰器,查询结果
print(Tom.getscore)
#触发setter装饰器
Tom.setscore=66
print(Tom.getscore)
#触发deleter装饰器
del Tom.delscore
print(Tom.getscore) #这里分数已经被删除了就会报错,'Test' object has no attribute '_Test__score'

其实@property装饰器的功能还有很多很多,我这里也就是用property装饰器去实现类中的方法转换为具有方法效果的属性功能,其他的我就不多说了,如果想了解更多关于property装饰器的可以去看看这个链接http://t.csdn.cn/4Ey3m

总结:

属性和方法是面向对象重要组成部分,其分为共有、特有、私有

共有:所有同一个类的实例对象都可以访问

特有:虽然同一个类的实例对象,但是有些属性是某一个实例对象特有的,其他实例对象是无法访问的

私有:私有是在类中定义的,把相关属性/方法设置为不允许访问,同一个类的实例对象都具有它们的私有属性,但是不允许访问

 好了,这一期就到这里了,下课!

分享一张壁纸~

Python进阶-----面向对象2.0(特有属性和方法与私有属性和方法)相关推荐

  1. Python笔记 · 私有方法、私有属性 单下划线、双下划线

    首先,不同于其他编程语言,Python中不存在真正意义上的"私有方法/属性",Python中所胃的"私有方法"要么基于约定,要么基于编译期的改写(Name Ma ...

  2. java mock私有方法_JMockit Mock 私有方法和私有属性

    前面说过 JMockit 因身处前线,所以简直无不可,本节例子演示 JMockit 怎么 Mock 私有方法和私有属性,示例虽然是静态方法和属性,但因采用的是反射手法,所以这种 Deencapsula ...

  3. JMockit Mock 私有方法和私有属性

    JMockit Mock 私有方法和私有属性 时间 2014-02-03 15:02:39   隔叶黄莺Unmi Blog 原文  http://unmi.cc/jmockit-mock-privat ...

  4. Python 进阶 — 面向对象编程

    目录 文章目录 目录 面向对象思想 面向对象编程 面向对象编程的特性 封装 继承 多态 面向对象编程的优势 Python 的类属性与类方法 Python 类的实例化 Python 的对象属性与对象方法 ...

  5. python类的私有属性_Python类的私有属性

    在 C++ 和 Java 中,属性(成员)有访问控制,如 public 表示任意代码可以访问该属性,private 表示仅当前类的代码才可以访问该属性. Python 中没有这个访问控制符,但是可以在 ...

  6. 类属性、类方法;私有属性、公有属性;私有方法、公有方法;静态属性、静态方法;python的命名规范__xx__\__xx\_xx(自用笔记)

    Ⅰ.类属性.类方法(类和实例都能调用类属性和类方法) 类是一个特殊的对象,Python 中 一切皆对象:class AAA: #定义的类属于 类对象obj1 = AAA() #属于 实例对象 除了封装 ...

  7. python基础:动态方法、私有属性、property、继承、重写、super、多态、符号重载、拷贝、组合、工厂模式,单例

    1.动态方法_代码示例 class Person:def work(self):print("努力上班!")def play_game(self):print("{0}玩 ...

  8. Python进阶-----property用法(实现了get,set,delete三种方法)

    一.可以利用property对静态属性的进行修改操作,包括设置和删除属性 1.调用静态属性===>在静态属性函数前先用@property: 2.设置静态属性===>在静态属性函数前加上@静 ...

  9. 私有属性和方法-伪私有属性和方法

    class Women:def __init__(self, name):self.name = nameself.__age = 18def __secret(self):# 在对象的方法内部,是可 ...

最新文章

  1. PL/SQL高级编程
  2. 如何解决访问Windows Update网站时收到0X8024001D错误信息
  3. 游戏行业的人工智能设计:AI的设计和实施
  4. php设计模式 -- 工厂模式
  5. 十、LINQ查询之延迟执行
  6. 微软:警惕 Web3 和去中心化网络中的“冰钓”威胁
  7. 钩子教程 - 原理(二十五) : 消息 -- WM_CANCELJOURNAL
  8. ibavformat.so.57: cannot open shared object file: No such file or directory
  9. php递归mysql查询_PHP MySQL递归查询
  10. onlinephototool免费在线图片处理器
  11. Java垃圾回收的时间点
  12. C++ 使用GDI+剪切图片
  13. 【Python】python转义字符
  14. win10浏览器加载很慢_win10中的浏览器打开网速特别慢是怎么回事_win10浏览器打开慢如何处理...
  15. Xshell 6链接Liunx链接不上:
  16. Linux Ubuntu常用软件
  17. 不可不知!4种常见的黑客攻击手段
  18. Oracle AWR报告详细分析
  19. 用 python-docx 比对 Word VS Excel 中的表格
  20. 大学计算机基础 小报,word制作电子小报教案.doc

热门文章

  1. 如何构建一个ERP系统(需求分析、系统架构、系统设计、系统编码、测试、交付程序及文文件)。
  2. 使用Golang开发一个本地代理
  3. 怎样用计算机产生均匀随机数,掌握利用计算器计算机产生均匀随机数的方法.PPT...
  4. 脉动风时程matlab程序,脉动风时程matlab程序
  5. UNIXC002 网络基础
  6. OSX:不同OSX版本号的标记可能不兼容
  7. Vue 列表下一页 上一页
  8. 直流给电容充电时,怎么产生的充电电流?
  9. 警惕北洋打印机的休眠,待机时间,请设置为最大时间(9999min)并保持隔一段时间重启下打印机...
  10. 迅捷CAD转换器进行CAD版本转换的步骤是什么?