day31 Pyhton 面向对象的基础 三大特性
一.內(nèi)容回顧
封裝
1.概念 筆記
2.__名字 在類的外部就不能用了
3.私有化的 不能被子類繼承,也不能在其他任何類中調(diào)用
三個(gè)裝飾器方法(裝飾類中的方法)
1.不被修飾的? 普通方法,會使用對象self的屬性
2.@classmethod? 類方法,不使用self的屬性,用類cls的屬性
3.@staticmethod 靜態(tài)方法,不用self的屬性和類cls的屬性
4.@property? 將一個(gè)方法偽裝成一個(gè)屬性
def? 函數(shù)名
@函數(shù)名.setter
@函數(shù)名.deleter
# from math import pi # class Circle: # def __init__(self,r): # self.r = r # @property # def area(self): # return pi*self.r**2 # @property # def perimeter(self): # 周長 # return 2*pi*self.r # @perimeter.setter # def perimeter(self,新的周長): # self.r = 新的周長 / 2 / pisetter修改屬性值
# setter裝飾的函數(shù)名叫什么 perimeter# 那么在這個(gè)函數(shù)中絕對不可以對這個(gè)函數(shù)名同名的屬性進(jìn)行修改 # 程序的邏輯問題# 1. 不可以對某些計(jì)算結(jié)果直接賦值# 2. 一般是通過對計(jì)算結(jié)果產(chǎn)生影響的屬性進(jìn)行重新賦值# 比如說對于圓這個(gè)例子 : 不能直接修改面積或者周長,應(yīng)該通過修改半徑來帶動對應(yīng)周長和面積的改變 # 反射(不得不用) # 使用字符串的方式,操作對象的屬性(對象屬性,類的動態(tài)屬性(方法)) # 在python中 一切皆對象(類也是對象,對象也是對象,模塊也是對象) # a.b # a就是一個(gè)對象 # b本質(zhì)上是一個(gè)變量名,也可以說是a的一個(gè)屬性 # 如果b是b 那么就用a.b # 如果b是'b' 那么就用getattr(a,'b')
二.面向?qū)ο蟮幕A(chǔ)
三大特性
基礎(chǔ)的繼承
基礎(chǔ)的封裝 __私有
兩個(gè)內(nèi)置函數(shù):issubclass? isinstance
反射: setattr/delattr? 了解
內(nèi)置方法: 你沒有應(yīng)用場景
__new__
__call__
__str__/__repr__
__len__
__***item__系列
__hash__
__eq__
issubclass(子類,父類),如果真的有繼承關(guān)系,就返回True
class A(object):pass class B(A):pass print(issubclass(B,A)) # isinstance(對象,類) # class A(object):pass # a = A() # print(isinstance(a,A)) # # 繼承 # class A(object):pass # class B(A):pass # b = B() # print(isinstance(b,A)) # 檢測的對象是不是某個(gè)類以及其父類的對象 # print(type(b) is B) # 檢測的是對象是不是某一個(gè)類的實(shí)例 # print(type(b) is A) 所有的反射 都是用字符串 操作對象的屬性 class A:def __init__(self,name,age):self.name = nameself.age = agea = A('alex',83) # hasattr # print(getattr(a,'name'))#alex # a.sex = '不詳' # setattr(a,'sex','不詳') # print(a.sex)#不詳 del a.age # delattr(a,'age') print(a.__dict__)#{'name': 'alex', 'sex': '不詳'} # 關(guān)于內(nèi)置方法的名字# 內(nèi)置方法 雙下方法 魔術(shù)方法 # 內(nèi)置方法的特點(diǎn)# 一定有某一個(gè)語法或者一種寫法自動觸發(fā)這個(gè)方法 # 重點(diǎn)掌握的# 哪些寫法 觸發(fā) 對應(yīng)的內(nèi)置方法# 實(shí)例化 __new__\__init__ 構(gòu)造方法(單例模式)\初始化方法# 對象() __call__# del 對象 __del__ 析構(gòu)方法\對象刪除之前的收尾工作# print(對象) __str__ 讓一個(gè)對象的顯示更加清晰# str(對象)# '%s'%對象# repr() __repr__ 是__str__的備胎,并且還和repr(),%r格式化有關(guān)系# '%r'%對象# len(對象) __len__# 對象[參數(shù)] item系列# == __eq__ __call__ 對象用call方法可以調(diào)用函數(shù)__call__里的方法 # __call__ class Student():def __init__(self,name,age):self.name = nameself.age = agedef call(self):passdef __call__(self, *args, **kwargs):print('調(diào)用我啦') alex = Student('alex',83) # callable #查看某個(gè)變量能否被調(diào)用 # callable(變量) #返回True,那么 變量() --> 調(diào)用 print(callable(Student))#True print(callable(alex))#True # alex() alex.call()#調(diào)用我啦 class Dog(object):def __new__(cls, *args, **kwargs):passdog_obj = object.__new__(cls)#調(diào)用父類object的__new__內(nèi)置方法dog_obj = super().__new__(cls)##調(diào)用父類object的__new__內(nèi)置方法,第二種方法return dog_objdef __init__(self,name,age):self.name = nameself.age = agewc = Dog('旺財(cái)',2) print(wc.name) # 一個(gè)類 只能實(shí)例化一次的方法 class Teacher:flag = Nonedef __new__(cls, *args, **kwargs):if cls.flag is None:cls.flag = object.__new__(cls) # 這一句話只能走一次return cls.flagdef __init__(self,name):self.name = namealex1 = Teacher('alex') alex2 = Teacher('alex') yuan = Teacher('yuan') print(alex2.name)#yuan print(yuan.name)#yuan __del__ # 析構(gòu)方法(了解) 刪除 class Teacher:def __init__(self,name):self.name = namedef __del__(self):print('執(zhí)行我啦')alex = Teacher('ALEX') del alex print('hahaha') # del alex # 執(zhí)行del 對象的時(shí)候 觸發(fā)__del__,在真正的刪除alex對象之前,執(zhí)行的方法__del__ # 如果我們自己不刪除alex,那么在程序的執(zhí)行過程中或者最后,垃圾回收機(jī)制會替你執(zhí)行del alex # 1.del alex # 2.執(zhí)行__del__ # 3.刪除alex class File(object):def __init__(self,file_name):self.f = open('file_name')def read(self):self.f.read(1024)def __del__(self):# 對象使用的一些操作系統(tǒng)的資源的歸還工作/收尾工作self.f.close() __str__ class Course:def __init__(self,name,price,period,teacher):self.name = nameself.price = priceself.period = periodself.teacher = teacherdef __str__(self): # 必須有返回值,必須返回一個(gè)str類型return '%s,%s,%s,%s'%(self.name,self.price,self.period,self.teacher) course_lst = [] python = Course('python',19800,'6 months','baoyuan') linux = Course('linux',16800,'5 months','oldboy') print(python) print(str(python)) print('課程展示 : %s'%python) class Course:def __init__(self,name,price,period,teacher):self.name = nameself.price = priceself.period = periodself.teacher = teacherdef __str__(self): # 必須有返回值,必須返回一個(gè)str類型return '%s,%s,%s,%s'%(self.name,self.price,self.period,self.teacher) course_lst = [] python = Course('python',19800,'6 months','baoyuan') linux = Course('linux',16800,'5 months','oldboy') print(python) print(str(python)) print('課程展示 : %s'%python) # list.__str__() l = [1,2,3,4] # 對象 列表的對象 print(l) print('[%s,%s,%s]'%(l[0],l[1],l[2])) __repr__ 是str方法的備胎(有str調(diào)用str,沒有str走repr) class Course:def __init__(self,name,price,period,teacher):self.name = nameself.price = priceself.period = periodself.teacher = teacherdef __repr__(self): # 必須有返回值,必須返回一個(gè)str類型return 'repr --> : %s,%s,%s,%s'%(self.name,self.price,self.period,self.teacher)def __str__(self): # 必須有返回值,必須返回一個(gè)str類型return 'str --> : %s,%s,%s,%s'%(self.name,self.price,self.period,self.teacher)python = Course('python',19800,'6 months','baoyuan') linux = Course('linux',16800,'5 months','oldboy') print(python) print(linux) class Course:def __init__(self,name,price,period,teacher):self.name = nameself.price = priceself.period = periodself.teacher = teacherdef __repr__(self): # 必須有返回值,必須返回一個(gè)str類型return 'repr --> : %s,%s,%s,%s'%(self.name,self.price,self.period,self.teacher)def __str__(self): # 必須有返回值,必須返回一個(gè)str類型return 'str --> : %s,%s,%s,%s'%(self.name,self.price,self.period,self.teacher) python = Course('python',19800,'6 months','baoyuan') linux = Course('linux',16800,'5 months','oldboy') print('%r'%python)#repr --> : python,19800,6 months,baoyuan print('%s'%python)#str --> : python,19800,6 months,baoyuan print(str(python))#str --> : python,19800,6 months,baoyuan print(repr(python))#repr --> : python,19800,6 months,baoyuan # 流暢的python : repr和str 如果只能寫一個(gè)的 寫repr class Course:def __init__(self,name,price,period,teacher):self.name = nameself.price = priceself.period = periodself.teacher = teacherdef __len__(self):return len(self.__dict__)def __getitem__(self,item):return self.__dict__[item]def __setitem__(self, key, value):self.__dict__[key] = valuedef __delitem__(self, key):self.__dict__.pop(key) python = Course('python',19800,'6 months','baoyuan') print(len(python)) print(python.name) print(python['name']) # ==> 調(diào)用getitem print(python['price']) # ==> 調(diào)用getitem python['name'] = 'python2.0' print(python.name) # del python.name#與下一句功能一樣 del python['name'] print(python.__dict__)#{'price': 19800, 'period': '6 months', 'teacher': 'baoyuan'} # 有一些內(nèi)置的函數(shù)/模塊 要想能正確的使用它們 那么必須按照它規(guī)定的語法來實(shí)現(xiàn) __len__ 測量對象長度 class Ruler:def __init__(self,price,length,jingdu):self.length = lengthself.price = priceself.jingdu = jingdudef __len__(self):return self.length stu_ruler = Ruler(2.5,15,0.1) print(len(stu_ruler))#15 __eq__ s1==s2 等于 s1.__eq__(s2) class Student():def __init__(self,name,age):self.name = nameself.age = agedef __eq__(self, other):if self.name == other.name and self.age == other.age:return Truereturn Falses1 = Student('賈衛(wèi)東',20) s2 = Student('賈衛(wèi)東',20) print(s1 == s2) # s1.__eq__(s2)#True print(s1 is s2) # s1.__eq__(s2)#False #夠通過這個(gè)字符串 --> 程序中的變量名(類名\函數(shù)名\變量名\方法名\對象名) class Manager:pass class Student:pass class Teacher:pass identify = 'Student' print(eval(identify)())#<__main__.Student object at 0x00000000025657B8>反射 hasattr getattr
class Person:role = '人類'Country = '中國'attr = input('>>>') # role 人類 # # Country 中國 print(getattr(Person,'role')) print(getattr(Person,'Country')) if hasattr(Person,attr):print(getattr(Person,attr))if attr == 'role':print(Person.role) elif attr == 'Country':print(Person.Country) class Person:role = '人類'@staticmethoddef show_courses():print('所有課程') # 反射類中的方法 # class Person: # role = '人類' # @staticmethod # def show_courses(): # print('所有課程') # Person.role == getattr(Person,'role') # Person.show_courses() == getattr(Person,'show_courses')() # ret = getattr(Person,'show_courses') # ret() # 有一個(gè)類,有很多靜態(tài)屬性,也有很多靜態(tài)方法/類方法 # 用戶輸入input任意的屬性名或者方法名, # 如果是屬性 直接打印 - 用到一個(gè)內(nèi)置函數(shù)#getattr(Person,'role') # 如果是方法 直接調(diào)用 - 用到一個(gè)內(nèi)置函數(shù)#getattr(Person,'show_courses') # 要求程序不報(bào)錯(cuò)?
??
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/pythonz/p/10029336.html
總結(jié)
以上是生活随笔為你收集整理的day31 Pyhton 面向对象的基础 三大特性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python基础——Linux系统下的文
- 下一篇: .NET/C# 异常处理:写一个空的 t