封裝,繫結方法與非繫結方法

2021-08-21 02:32:22 字數 3291 閱讀 6734

一:封裝

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.非繫結方法 特殊之...