一:描述
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