一:封裝
1,什麼是封裝:
封:屬性對外是隱藏的,但對內是開放的
裝:申請乙個命名空間,往裡面填入一系列名字/屬性
2,為什麼要封裝?
封裝資料屬性的目的
首先定義屬性的目的就是為了給類外部的使用的,隱藏之後是為了不讓外部直接使用,需要類內部開闢乙個介面。然後讓類外部的使用通過介面來間接地操作隱藏的屬性。
精髓在於:我們可以在介面之上附加任意邏輯,從而嚴格控制使用者對屬性的操作
封裝函式的屬性
首先定義函式的目的就是為了讓類的外部使用的 ,隱藏函式屬性是為了不讓外部直接使用,需要類內部開闢乙個介面,然後在介面內去呼叫隱藏的功能
精髓在於:隔離了複雜度
3,如何隱藏屬性?
在屬性錢加上__(雙下劃線)開頭
1,這種隱藏僅僅只是一種語法上的變形操作
2,這種語法上的變形只是在定義階段發生一次,因為類體**僅僅只是在定義階段檢測一次
3,這種隱藏是對外不對內的,即在類的內部的可以直接訪問,而在類的外部則無法直接訪問。原因是:在類的定義階段,類體內的**統一發生了一次形變
4,如果不想讓子類 的方法覆蓋父類的,可以將該方法名前面加乙個__開頭
# class people:
# __country='china' #_people__country='china'#發生變形
# __n=100 #_people__n=100
# def __init__(self,name,age,***):
# self.__name=name #self._people__name=name
# self.age=age
# self.***=***
# def eat(self):
# print('eat.....')
# print(people.__country) #people._people__country#變形
# print(self.__name) #self._people__name#變形
# people.eat(123)
# print(people.__country)
# peo1=people('egon',18,'male')
# peo1.eat()
# print(peo1.__name)
# print(people.__dict__)
# print(people.__country)
# print(people._people__country)
# people.__x=11
# print(people.__dict__)
# peo1=people('egon',18,'male')
# print(peo1.__dict__)
# peo1.__x=111
# print(peo1.__dict__)
二:繫結方法?
1,繫結方法:
特性:繫結給誰就應該由誰來呼叫,誰來呼叫就會將誰當作第乙個引數自動傳入
精髓在於自動傳值
繫結方法分為兩類:
1.1 繫結給物件方法:在類內部定義的函式(沒有內任何裝飾器修飾的 ),預設就是繫結給物件用的。
1.2 繫結給類的方法:
在類內部定義的函式如果被裝飾器@classmethod裝飾,那麼則是繫結給類的,應該由類來呼叫,類來呼叫就自動將類當作第乙個引數自動傳入。
2 非繫結方法:類中定義的函式如果被裝飾器@staticmethod裝飾,那麼該函式就變成了非繫結方法,既不與類繫結,又不與物件繫結,意味著類與物件都可以來呼叫,但是無論誰來呼叫,都沒有任何自動傳值的效果,就是乙個普通的函式
3,應用
如果函式體**需要用外部傳入的類,則應該將該函式定義成繫結給類的方法
如果函式體**需要用外部傳入的物件,則應該將該函式定義成繫結給物件的方法
如果函式體**既不需要外部傳入的引數,也不需要外部傳入的物件,則應該將該函式定義成非繫結方法/普通函式。
# class foo:
# @classmethod
# def f1(cls):
# print(cls)
# def f2(self):
# print(self)
# obj=foo()
# print(obj.f2)
# print(foo.f1)
# foo.f1()
# print(foo)
#1、f1繫結給類的
# 了解:繫結給類的應該由類來呼叫,但物件其實也可以使用,只不過自動傳入的仍然是類
# print(foo.f1)
# print(obj.f1)
# foo.f1()
# obj.f1()
#2、f2是繫結給物件的
# obj.f2()
# foo.f2(obj)
繫結類方法,繫結物件方法,非繫結方法
import settings
import uuid
class mysql:
def __init__(self,ip,port):
self.uid=self.create_uid()
self.ip=ip
self.port=port
def tell_info(self):
print('%s:%s' %(self.ip,self.port))
@classmethod
def from_conf(cls):
return cls(settings.ip, settings.port)
@staticmethod
def func(x,y):
print('不與任何人繫結')
@staticmethod
def create_uid():
return uuid.uuid1()
# 預設的例項化方式:類名(..)
obj=mysql('10.10.0.9',3307)
# 一種新的例項化方式:從配置檔案中讀取配置完成例項化
# obj1=mysql.from_conf()
# obj1.tell_info()
# obj.func(1,2)
# mysql.func(3,4)
# print(obj.func)
# print(mysql.func)
print(obj.uid)
繫結方法與非繫結方法
特性 繫結給誰就應該由誰來呼叫,誰來呼叫就會將誰當作第乙個引數自動傳入 精髓在於自動傳值 繫結方法分為兩類 1.1 繫結給物件方法 在類內部定義的函式 沒有被任何裝飾器修飾的 預設就是繫結給物件用的 1.2 繫結給類的方法 在類內部定義的函式如果被裝飾器 classmethod裝飾,那麼則是繫結給類...
9 繫結方法與非繫結方法
非繫結方法 繫結方法 1.繫結給類的方法 classmethod classmethod是乙個裝飾器,起作用就是宣告下面的函式是繫結給類的,可用 類.函式名 來進行呼叫即繫結到類。類在使用時會將類本身當做引數傳給類方法的第乙個引數 即便是物件來呼叫也會將類當作第乙個引數傳入 python為我們內建了...
繫結方法與非繫結方法,反射,內建方法
類中定義函式分為了兩大類 1.繫結方法 特殊之處 繫結給誰就應該由誰來呼叫,誰來呼叫就會將誰當作第乙個引數自動傳入 繫結給物件的方法 在類中定義函式沒有被任何裝飾器的情況下,預設就是繫結物件的 繫結給類的方法 為類中定義函式新增乙個裝飾器class method,就是繫結類的 2.非繫結方法 特殊之...