python学习day26 封装 property 类方法 静态方法 反射
封裝
廣義上面向對象的封裝 :代碼的保護,面向對象的思想本身就是一種
只讓自己的對象能調用自己類中的方法
狹義上的封裝 —— 面向對象的三大特性之一
屬性 和 方法都藏起來 不讓你看見
私有屬性
class Person:__key = 123 # 私有靜態屬性def __init__(self,name,passwd):self.name = nameself.__passwd = passwd # 私有屬性def __get_pwd(self): # 私有方法return self.__passwd #只要在類的內部使用私有屬性,就會自動的帶上_類名def login(self): # 正常的方法調用私有的方法self.__get_pwd() alex = Person('alex','alex3714') print(alex._Person__passwd) # _類名__屬性名 雖然能外部調用 但不建議用?
所有的私有 都是在變量的左邊加上雙下劃綫
- 對象的私有屬性
- 類中的私有方法
- 類中的靜態私有屬性
所有的私有的 都不能在類的外部使用,只能在內部使用
父類的私有屬性不能被子類調用
會用到私有的場景:
1.隱藏起一個屬性 不想讓類的外部調用
2.我想保護這個屬性,不想讓屬性隨意被改變
3.我想保護這個屬性,不被子類繼承
property內置裝飾器函數
比較重要
@property只在面向對象中使用,將一個方法偽裝成一個屬性
from math import pi class Circle:def __init__(self,r):self.r = r@propertydef perimeter(self):return 2*pi*self.r@propertydef area(self):return self.r**2*pic1 = Circle(5) print(c1.area) # 圓的面積 print(c1.perimeter) # 圓的周長 # 如果不加property的話,調用需要方法名+括號:print(c1.perimeter())被property裝飾的方法不能傳任何參數
?
?對對象屬性的修改
一般情況下,會定義一個私有屬性,再用property裝飾一個與私有屬性同名的方法,這樣可以對這個屬性進行查看或者用這個屬性進行操作:
class Goods:discount = 0.8def __init__(self,name,price):self.name = nameself.__price = price@propertydef price(self):return self.__price * Goods.discount apple = Goods('蘋果',5) print(apple.price)?
# 屬性 查看 修改 刪除 class Person:def __init__(self,name):self.__name = nameself.price = 20@propertydef name(self):return self.__name@name.deleterdef name(self):del self.__name@name.setterdef name(self,new_name):self.__name = new_name brother2 = Person('二哥') del Person.price # 觸發name.deleter下的方法 brother2.name = 'HAHA' # 改名字時觸發name.setter下的方法 print(brother2.name) # 'HAHA'?
class_static
classmethod 類方法? ****
通過類直接調用的方法 類.方法??有一個默認參數?cls
這個方法的操作只涉及靜態屬性的時候 就應該使用classmethod來裝飾這個方法
# 類的操作行為 class Goods:__discount = 0.8def __init__(self,name,price):self.name = nameself.__price = price@propertydef price(self):return self.__price * Goods.__discount@classmethod # 把一個方法 變成一個類中的方法,這個方法就直接可以被類調用,不需要依托任何對象def change_discount(cls,new_discount): # 修改折扣cls.__discount = new_discount apple = Goods('蘋果',5) print(apple.price) Goods.change_discount(0.5) # 將類的靜態屬性修改 print(apple.price) # 2.5?
staticmethod 靜態方法? ***
在完全面向對象的程序中,如果一個函數,既和對象沒有關系 也和類沒有關系 那么就用staticmethod將這個函數變成一個靜態方法
?
class Login:def __init__(self,name,password):self.name = nameself.pwd = passworddef login(self):pass@staticmethoddef get_usr_pwd(): # 靜態方法usr = input('用戶名 :')pwd = input('密碼 :')Login(usr,pwd)Login.get_usr_pwd()?
類方法和靜態方法 都是類調用的
對象可以調用類方法和靜態方法么? 可以 一般情況下 推薦用類名調用
類方法: 有一個默認參數 cls 代表這個類 cls
靜態方法:? 沒有默認的參數 就象函數一樣
反射
比較重要
hasattr()和getattr()內置函數
通過字符串能夠拿到所對應的屬性或方法的值,方法后面要加(),值直接顯示
hasattr()和getattr()總在一起,一個判斷,一個執行
class Teacher:dic = {'查看學生信息':'show_student','查看講師信息':'show_teacher'}def show_student(self):print('show_student')def show_teacher(self):print('show_teacher')@classmethoddef func(cls):print('hahaha') alex = Teacher() for k in Teacher.dic:print(k) key = input('輸入需求 :') if hasattr(alex, Teacher.dic[key]): # 判斷這個Teacher.dic[key]字符在不在alex中func = getattr(alex, Teacher.dic[key]) func() # 'hahaha'也可以執行類.方法或類.對象
if hasattr(Teacher,'func'):ret2 = getattr(Teacher,'func') # 類.方法 teacher.funcret2()?
類中屬性
靜態屬性
成員屬性
私有屬性
類中方法
普通方法 self
靜態方法 @staticmethod
類方法 @classmethod
屬性方法 @property
內置方法
?
轉載于:https://www.cnblogs.com/happyfan/p/10091289.html
總結
以上是生活随笔為你收集整理的python学习day26 封装 property 类方法 静态方法 反射的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序10 VC编写批量重命名工具
- 下一篇: 【刷题】BZOJ 2194 快速傅立叶之