python面向对象方法与属性

一:描述

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,使得方法变成了属性,调用不用加括号了

 

posted @ 2023-11-28 13:16  秒秒开心  阅读(20)  评论(0编辑  收藏  举报