一、封裝
1、封裝指的就是把資料與功能都整合到一起
2、在封裝的基礎上,我可以將裝到物件或者類中的屬性給隱藏起來
注意:
(1)在定義類或者初始化物件時,在屬性前加__,就會將該屬性隱藏起來
但該隱藏起始只是一種變形_類名__屬性名,并沒有真的隱藏起
(2)該變形操作是在類定義階段掃描語法時發生的變形,類定義之后添加的__開頭的屬性不會發生變形
(3)該隱藏是對外不對內
(4) 在繼承中,父類如果不想讓子類覆寫自己的方法,可以將方法定義為私有的???
# 例1 # class Student: # __school = "oldboy" # _Student__school = "oldboy" # # def __init__(obj, x, y, z): # obj.__name = x # obj._Student__name = x # obj.age = y # obj.gender = z # # def __choose(self): # obj._Student__choose # print("%s 正在選課" %self.name) # # # stu_obj1 = Student("馮瘋子", 18, "female") # stu_obj1.__x=111 # print(stu_obj1.__dict__) # print(stu_obj1.__x) # print(stu_obj1.__dict__) # print(stu_obj1._Student__name) # print(Student.__dict__) # print(Student._Student__school) # print(stu_obj1._Student__school)
隱藏屬性的意義
1、把資料屬性隱藏起來的意義是:在類內開放介面,讓外界使用者通過介面來操作屬性值,我們可以在介面之上附加任意的邏輯
來嚴格控制外界使用者對屬性的操作
# class Student: # __school = "oldboy" # _Student__school = "oldboy" # # def __init__(obj, x, y, z): # obj.__name = x # obj._Student__name = x # obj.__age = y # obj.gender = z # # def __choose(self): # obj._Student__choose # print("%s 正在選課" % self.name) # # def get_name(self): # print(self.__name) # print(self._Student__name) # # def set_age(self,x): # if type(x) is not int: # print("年齡必須是整型,傻叉") # return # self.__age = x # # def get_age(self): # print(self.__age) # # def del_age(self): # del self.__age # # stu_obj1 = Student("馮瘋子", 18, "female") # # stu_obj1.get_name() # # # # stu_obj1.set_age("asfdasfdasfafd") # stu_obj1.set_age(19) # stu_obj1.get_age() # # print(stu_obj1.__dict__)
2、把功能屬性隱藏起來:隔離復雜度
# class ATM: # def __card(self): # print('插卡') # def __auth(self): # print('用戶認證') # def __input(self): # print('輸入取款金額') # def __print_bill(self): # print('列印賬單') # def __take_money(self): # print('取款') # # def withdraw(self): # self.__card() # self.__auth() # self.__input() # self.__print_bill() # self.__take_money() # # a=ATM() # a.withdraw()
二、裝飾器
1、 property
# 例1 # class People: # def __init__(self, name, height, weight): # self.name = name # self.height = height # self.weight = weight # # @property # def bmi(self): # return self.weight / (self.height ** 2) # # # p = People('egon', 1.81, 70) # p.height = 1.84 # print(p.bmi())
# 例2 # class Student: # __school = "oldboy" # _Student__school = "oldboy" # # def __init__(obj, x, y, z): # obj.__name = x # obj.__age = y # obj.gender = z # # def get_name(self): # print("訪問控制") # return self.__name # # def set_name(self,x): # print("賦值控制") # self.__name = x # # def del_name(self): # print("洗掉控制") # del self.__name # # def get_age(self): # return self.__age # # def set_age(self, x): # if type(x) is not int: # print("年齡必須是整型,傻叉") # return # self.__age = x # # def del_age(self): # print("不讓刪") # # # age = property(get_age, set_age, del_age) # name = property(get_name, set_name, del_name) # # # stu_obj1 = Student("馮瘋子", 18, "female") # # # print(stu_obj1.age) # # stu_obj1.age = "19" # # del stu_obj1.age # # print(stu_obj1.age) # # # print(stu_obj1.name) # # stu_obj1.name="EGON" # # del stu_obj1.name
# 例3: class Student: __school = "oldboy" # _Student__school = "oldboy" def __init__(obj, x, y, z): obj.__name = x obj.__age = y obj.gender = z @property def name(self): print("訪問控制") return self.__name @name.setter def name(self, x): print("賦值控制") self.__name = x @name.deleter def name(self): print("洗掉控制") del self.__name stu_obj1 = Student("馮瘋子", 18, "female") stu_obj1.name
2、系結與非系結
類中的定義的函式
--- 系結方法:誰來呼叫就會將誰當作第一個引數傳入
(1)系結給物件的方法:類中定義的函式默認就是系結給物件的方法,應該是由物件呼叫,會把物件當作第一個引數傳入
(2)系結給類的方法:在類中的函式上加一個裝飾器@classmethod,該函式就系結給類了,應該是由類來呼叫,會把類當作第一個引數傳入
---非系結方法:既不與類系結也不與物件系結,就是一個普通的函式,誰都可以來呼叫,沒有自動傳參的效果,
在函式上添加裝飾器@staticmethod
# class People: # def __init__(self, name, age): # self.name = name # self.age = age # # def tell_info(self): # print("<%s:%s>" % (self.name, self.age)) # # @classmethod # def f1(cls): # print(cls) # # @staticmethod # def f2(x,y,z): # print(x,y,z) # # # p1=People('egon',18) # # p1.tell_info() # # # print(p1.tell_info) # # print(People.f1) # # # People.f1() # # # print(p1.f2) # # print(People.f2) # p1.f2(1,2,3) # People.f2(1,2,3)
# 例1 import uuid import settings
##sttings里的內容: IP='106.78.13' PORT=3306 class MySQL: def __init__(self,ip,port): self.mid = self.__create_id() self.ip = ip self.port = port def tell_info(self): print("%s:<%s:%s>" %(self.mid,self.ip,self.port)) @staticmethod def __create_id(): return uuid.uuid4() @classmethod def from_conf(cls): return cls(settings.IP, settings.PORT) # obj = MySQL("10.10.11.11",3306) # obj.tell_info() obj1=MySQL.from_conf() obj1.tell_info()
---25---
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/65149.html
標籤:Python
上一篇:電信用戶流失分析與預測
