python面向对象进阶
生活随笔
收集整理的這篇文章主要介紹了
python面向对象进阶
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
property 內置裝飾器函數 只在面向對象中使用
from math import piclass Circle:def __init__(self, r):self.r = r@property # 將類似屬性卻需要操作得到的一些方法偽裝成對象屬性def perimeter(self):return 2 * pi * self.r@propertydef area(self):return pi * self.r ** 2circle = Circle(5) print(circle.perimeter) # 調用方法和操作屬性相同 本質上還是方法 print(circle.area)? property 提供私有屬性的查看,修改和刪除
class Person:def __init__(self, name):self.__name = name@propertydef name(self):return self.__name@name.setter # 修改 通過賦值來修改def name(self, new_name):self.__name = new_name@name.deleterdef name(self):del self.__namep = Person('zxc') print(p.name) # zxc p.name = 'zxf' print(p.name) # zxf del p.name # 這里的del只是對應@name.deleter,主要看@name.deleter下面的方法執行了什么 # print(p.name) # 報錯 顯示沒有name屬性classmethod和staticmethod
class Person:__key = '人類'def __init__(self, name):self.__name = name@propertydef name(self):return self.__name@classmethod # 將一個方法變成類中的方法,使這個方法可以直接被類調用而不用依托對象def change_key(cls, new_key):cls.__key = new_keyprint(Person._Person__key) # 人類 Person.change_key('human') print(Person._Person__key) # human # 當這個方法的操作只涉及靜態屬性的時候 就應該使用classmethod來裝飾這個方法 classmethod class Login:def __init__(self,name,password):self.name = nameself.pwd = passworddef login(self):pass@staticmethod # 裝飾一個完全跟類和對象沒有關系的靜態方法,通過類調用def get_usr_pwd(): # 靜態方法usr = input('用戶名 :')pwd = input('密碼 :')Login(usr, pwd) # 一般用在完全面向對象編程的時候 staticmethod? isinstance和issubclass
class Person:passclass Student(Person):passp = Person() print(isinstance(p, Person)) # True 判斷p是不是Person的實例化對象 print(issubclass(Student, Person)) # True 判斷Student是不是Person的子類 print(issubclass(Person, Student)) # False?
__str__和__repr__
print('zxc') # 打印對象時,就是調用對象的__str__方法 print(str('zxc')) # str(obj) 本質就是 obj.__str__ print('zxc'.__repr__()) # 'zxc' 將對象原封不動的打印出來 print(repr('zxc')) # repr(obj) 本質就是 obj.__repr__ # 格式化輸出中的%s和%r就是使用的__str__和__repr__自己來個類測試一下
class Person:def __str__(self):return 'str zxc'passzxc = Person() # print(zxc) # not zxc 執行了Person類里面的__str__的方法 # 如果注釋掉Person類里面的__str__的方法,找不到就到父類里面找,而在新式類中默認繼承object,而object中帶有__str__方法 print(zxc) # 打印了對象的內存地址?
測試中發現個有趣的事情,__repr__是__str__備胎。
class Person:def __str__(self):return 'str zxc'def __repr__(self):return 'repr zxc'zxc = Person() print(zxc) # str zxc# 注釋掉__str__方法 print(zxc) # repr zxc 說明__repr__方法是__str__的備用方法,當類中找不到__str__就找__repr__,都沒有 再去找父類# 重新放開__str__方法,注釋掉__repr__方法 print(repr(zxc)) # 打印了對象的內存地址 說明當類里找不到__repr__方法,就直接去父類里找,不能備用__str____del__? 構造析構函數
class File:def __del__(self):print('執行了!')file = File() del file # 執行了! 再執行__del__函數后,進而刪除了對象 print(f) # 報錯 顯示找不到對象f可能用到的環境:
class File:def __del__(self):self.f.close()print('執行了關閉文件工作!')file = File() file.f = open('file', 'w') del file # 執行了關閉文件工作! # 可以在刪除一個對象之前進行一些收尾的工作__call__?將一個類變為可調用的,當調用時執行__call__函數
class Person:def __init__(self, name):self.name = namedef __call__(self, *args, **kwargs):print('對象的名字是%s' %self.name)person = Person('zxc') person() # 對象的名字是zxc# 也可以直接調用類 Person('zzy')() # 對象的名字是zzy?
轉載于:https://www.cnblogs.com/zxc-Weblog/p/8326146.html
總結
以上是生活随笔為你收集整理的python面向对象进阶的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DP Big Event in HDU
- 下一篇: bzoj 2563 贪心 思想