首页 > 编程语言 >python面向对象方法与属性

python面向对象方法与属性

时间:2023-11-28 13:22:23浏览次数:41  
标签:__ python money self 面向对象 方法 取款 属性

一:描述

python中面向对象方法与属性:
①静态变量:实例变量、类变量
②静态方法:@staticmethod,相当于被放到类里的函数
③私有属性和方法:以两个下划线开头,如__secret()
④魔术方法:以两个下划线开头且以两个下划线结尾,如__secret__()
⑤受保护的属性和方法:以一个下划线开头,如_secret()
⑥特殊方法:@property,将方法变为属性,调用方法时不需要加括号

 

二:详细说明

用父亲和儿子的例子来说明上面方法和属性的关系:

基本信息:
父亲和儿子这一家都住在A小区1503号,父亲名字叫老王,儿子叫小王,父亲的存款有50万,取款密码666888,父亲和儿子都开小汽车上班

套用关系:
1.地址A小区1503号就可以看成是一个类变量,一家人共享这个房子的地址
2.老王和小王就可以看成是一个实例变量,实例就是对象的意思,即每个对象每个人都有自己的名字
3.开小汽车这个动作可以看成是一个静态方法,大家都会开
4.父亲的存款50万,只有家里人和亲戚知道,因为父亲在亲戚面前吹牛皮说出去了,可以看成是受保护的属性和方法,外面的人不知道
5.父亲的取款密码只有父亲自己知道,连儿子都没有告诉,儿子也别想取他的钱,这就是私有属性和方法

我们可以用代码表示这种关系:

 1 class Father:  
 2     #静态变量:地址  
 3     address = "A小区1503号"  
 4   
 5     def __init__(self,name,money="50万",password="666888"):  
 6         #name是实例变量,每个对象都有自己的名字,都不一样  
 7         self.name = name  
 8         #_money是受保护的属性,只有家里人和亲戚知道,外面的人不知道,即同一个包内可以访问,出了包就访问不了了  
 9         self._money = money  
10         #__password是私有属性,只有自己知道,连儿子都不知道,即只能类内调用,类外不能用  
11         self.__password = password  
12   
13     #静态方法,不需要传self  
14     @staticmethod  
15     def drive_car():  
16         return "我开车去上班!"  
17   
18     #_get_money是受保护的方法,只有家里人和亲戚知道,外面的人不知道,即同一个包内可以访问,出了包就访问不了了  
19     def _get_money(self):  
20         return f"老爸的存款有:{self._money}"  
21   
22     # __withdraw_money取款是私有方法,只有自己能取连儿子也不能取,即只能类内调用,类外不能用
23     def __withdraw_money(self,crash):  
24         return f"取出现金{crash}元!"  
25   
26     #get_crash为实例方法,每个对象都能取钱,只要取款密码输入正确,就能取钱  
27     def get_crash(self,pawd,crash):  
28         if self.__password == pawd:  
29             self.__withdraw_money(crash)  
30         else:  
31             return f"{self.name}正在取款,取款密码输入错误,取款失败!"  
32   
33 class Son(Father):  
34     pass  
35   
36 if __name__ == '__main__':  
37     #类可以直接调用静态变量  
38     print(f"家里地址是:%s" % Father.address)  
39     #类可以直接调用静态方法,常用于工具类  
40     print(Father.drive_car())  
41   
42     son = Son("小王")  
43     #包内可以调用受保护的属性  
44     print(f"老爸的存款有:%s" % son._money)  
45     #包内可以调用受保护的方法  
46     print(son._get_money())  
47     #儿子不知道老爸的密码,即子类无法继承父类的私有属性,只有父类自己在类内可以用  
48     #son.__password  
49     #儿子无法用老爸的银行卡取款,即子类无法继承父类的私有方法,只有父类自己在类内可以用  
50     #son.__withdraw_money("2千")  
51     #儿子可以试着输入密码,取老爸的钱,如果密码正确就可以取款,即子类可以继承父类的实例方法  
52     print(son.get_crash("222333", "2千"))
53 
54 >>> 运行结果如下:
55 >>> 家里地址是:A小区1503号
56 >>> 我开车去上班!
57 >>> 老爸的存款有:50万
58 >>> 老爸的存款有:50万
59 >>> 小王正在取款,取款密码输入错误,取款失败!

 

三、关于@property将方法变为属性

本来调用方法是需要跟上()的,但是给方法加上@property装饰以后,调用方法就不用加括号了,加了反而会报错

 1 class Info:  
 2     # 将方法变成属性  
 3     # 调用该方法的时候,不需要加括号,加括号会报错  
 4     @property  
 5     def send(self):  
 6         print("123")  
 7   
 8 if __name__ == '__main__':  
 9     info = Info()  
10     info.send
11 
12 >>> 程序运行结果如下:
13 >>> 123

这里第10行,调用send方法,不可以加括号,即info.send()会报错,因为加上@property后,send方法变为属性的效果了。

在举一个框架中的例子:

 1 def testGetMsg():  
 2     '''  
 3     普通的GET类型接口  
 4     :return:  
 5     '''    
 6     getUrl = host + "/pinter/com/getSku"  
 7     paramContent = {"id":1}  
 8     response = requests.get(getUrl,params=paramContent)  
 9     print(response.json())  
10     print(response.text)
11 
12 if __name__ == '__main__':  
13     testGetMsg()

这里的response获取text的时候,可以看到没有加括号,而获取json的时候就加了括号,它们都是方法,为什么text不用加括号调用呢,就是因为底层封装将text方法赋予了@property,使得方法变成了属性,调用不用加括号了

 

标签:__,python,money,self,面向对象,方法,取款,属性
From: https://www.cnblogs.com/miaomiaokaixin/p/17861729.html

相关文章

  • python对象嵌套
    一、描述python对象嵌套,即包含的关系。python实现:班级(名字,多个学生)、学生(学号,姓名) 二、详细说明要想实现班级里含有多个学生的这种关系,可以在班级类里嵌套学生类,将学生类信息以列表的形式存储保存即可1classStudent:2def__init__(self,s_no,s_name):3......
  • python虚拟环境
    一:问题我下了别人的工程,工程环境是用全局的python环境好,还是弄一个虚拟环境好一点,为什么? 二:回答用虚拟环境好,因为能够实现环境分离,你能在虚拟环境中安装项目特定的依赖项,而不会影响全局Python环境。从而实现不同项目维护不同的依赖关系,而不必担心版本冲突或相互影响。具体操......
  • python函数返回多个值会打包成元组
    一:问题python中函数可以一次返回多个值么? 二:回答可以的,其一次返回的多个值会被打包成元组如下所示:defdemo2(name,age):content=f"nameis{name},ageis{age}"returnname,age,contentif__name__=="__main__": data=demo2("mmkx",20) pri......
  • python函数return会结束整个函数的执行
    一:问题python函数中有for循环,对for循环进行return,函数会继续往下执行么? 二:回答不会。如下所示:defdemo3():print("a")foriinrange(3):print(i)returniprint("b")defdemo4():print("a")foriinran......
  • python中lambda函数如何理解
    一:问题python中lambda函数如何理解? 二:回答如下所示:defadd(a,b):returna+bdata=lambdaa,b:a+bif__name__=="__main__": print(add(3,4)) print(data(3,4))>>>运行结果如下:>>>7>>>7这里lambda函数,可以这样理解:lambda替代了上面的d......
  • python中调用函数,只写一个函数名是什么意思?
    一:问题python中调用函数,只写一个函数名是什么意思? 二:回答只写函数名,则调用的是函数的地址写函数名并传参,则调用的是函数返回值举例说明:1test_data=[{"name":"李白","order":1},{"name":"杜甫","order":4},2{"name":"高力士",......
  • 带有最小间隔时间的队列读取实现 —— 最小等待时间的队列 —— Python编程
     (注:照片源自免费网站,地址:https://www.freepik.com/photos/angry-panda/13)  ==================================================  事情起源是最近在看一个TensorFlow的代码,是TensorFlow实现了一个最小等待时间的队列,解释一下就是一个进程阻塞在一个队列上等待数据的读取,但是......
  • python通过requirements.txt文件管理工程包
    一:问题你创建了一个python工程,里面有很多包,怎么让别人拿到这个工程时,知道要安装哪些包,并一键自动全部安装呢? 二:解决方案你可以在你的工程中,执行下面的命令,它可以自动生成你的工程的依赖包清单:pipfreeze>requirements.txt别人拿到你的工程后,可以执行下面的命令,实现一键......
  • [Vue] vue学习笔记(2): 监视属性 & 计算属性
    关于计算属性案例:分别输入姓和名,打印全名基本代码<divid='root'> firstname<inputtype="text"v-model="firstname"><br/><br/> lastname<inputtype="text"v-model="lastname"><br/><br/>......
  • 【Lidar】基于Python的点云数据下采样+体素显示
    ​1Open3D库介绍        Open3D是一个开源的3D数据处理库,发布于2015年,目前已经更新到0.17.0版本。它基于MIT协议开源许可,使用C++11实现,并经过高度优化,还通过PythonPybinding提供了前端PythonAPI。Open3D为开发者提供了一组精心选择的数据结构和算法,内部实现高度优化......