物件導向之封裝

2022-09-16 16:12:18 字數 4790 閱讀 7969

[toc

一:封裝

1:什麼是封裝?

封裝是類的三大特性,封裝就是把功能和資料整合在一起?

2:為什麼要有封裝?

以為封裝能讓**整合度更高

3:如何使用封裝?

直接定義使用即可

在封裝的基礎上,我們可以將裝到物件或者類中的屬性隱藏起來

1:在定義類或者初始化物件時,在屬性前加__,就會將該屬性隱藏起來,但是該隱藏其實只是一種變形,_類名__屬性名,並沒有真的隱藏起來

2:該變形操作是在類定義階段掃瞄書法時發生的變形,類定義之後新增的__開頭的屬性不會發生變形

3:該隱藏對內不對外

4:在繼承中,父類如果不想讓子類覆蓋自己的方法,可以將方法定義為私有屬性

class student:

__school = '日本校區'

def __init__(self,name,age,gender):

self.__name = name

self.age = age

self.gender = gender

def __choose(self):

print(f"正在選課!")

stu = student('alen',18,'female')

stu.__name = 111 # 新建立了乙個屬性

print(stu.__dict__)

print(stu.__name)

print(stu.__dict__)

print(stu._student__name) # 'alen'

print(stu.__dict__)

print(student._student_school)

print(stu._student__school)

把資料屬性隱藏起來的意義是:在類內開放介面,讓外界使用介面來操作屬性值,我們可以在介面之上附加任意的邏輯,來嚴格控制外界對屬性的操作
把功能屬性隱藏起來
class  student:

__school = 'oldbyo' #

def __init__(self,name,age,gender):

self.__name = name

self.__age = age

self.gender = gender

def __choose(self):

print(f"正在選課")

def get_name(self):

print(self.__name) # print(self._student__name)

def get_age(self):

print(self.__age)

def set_age(self,age):

if type(age) is not int:

print("年齡必須是整型,眼瞎")

return

self.__age = age

def del_age(self):

del self.__age

class people:

def __init__(self,name,height,weight):

self.name = name

self.height = height

self.weight = weight

def bmi(self):

return self.weight / (self.height **2)

p = people('egon',1.81,70)

p.height = 1.84

p.bmi()

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

p.bmi

示列2

class student:

__school = '東京校區'

def __init__(self,name,age,gender):

self.__name = name

self.age = age

self.gender = gender

def get_name(self):

print("訪問介面")

return self.__name

def set_name(self,name):

print('修改操作')

self.__name = name

def del_name(self):

del self.__name

def get_age(self):

retrun self.__age

def set_age(self,age):

if type(age) is not int:

print("年齡必須是整型,傻瓜")

return

def del_age(self):

print("不讓刪除")

age = property(get_age,set_age,del_age)

name = property(get_name,set_name,del_name)

s1 = student("alen",18,'female')

s1.age = 19

del s1.age

print(s1.age)

s1.name = 'egon'

del s1.name

示列3

class student:

__school = '上海校區'

def __init__(self,name,age,gender):

self.name = name

self.age = age

self.gender = gender

@property

def name(self):

print("訪問")

return self.__name

name.setter

def name(self,name):

self.__name = name

@name.deleter

def name(self):

print("刪除")

del self.__name

s1 = student('alen',18,'female')

s1.name

繫結方法:誰來呼叫就會將誰當作第乙個引數傳入

繫結給物件的方法:類中定義函式預設就是繫結給物件的方法,應該是由物件來呼叫,會把物件當作第乙個引數傳入

繫結給類的方法:在類中的函式加乙個裝飾器@classmethod,該函式就繫結給類了,應該是由類來呼叫,會把類當作第乙個引數傳入

非繫結方法:既不與類繫結也不與物件繫結,就是乙個普通函式,誰都可以來呼叫,沒有自動傳參的效果,需要在函式新增裝飾器staticmethod

class people:

def __init__(self,name,age):

self.name = name

self.age = age

def tell_info(self):

print(f"")

@classmethod

def foo(cls):

print(cls) # student

@staticmethod

def bar(x,y,z):

print(x,y,z)

p1 = people('egon',18)

p1.tell_info()

print(people.foo)

people.bar(1,2,3)

示列

settings

ip = '127.0.0.1'

port = 3306

import uuid

import mysql

class mysql:

def __init__(self,ip,port):

self.mid = self.__create_id()

self.ip = ip

self.port = port

def tell_info(self):

print(f"")

@staticmethod

def __create_id():

return uuid.uuid4()

@classmethod

def from_conf(cls):

return cls(settings.ip,settings.port)

obj = mysql('10,1,2,3',3306)

obj.tell_info()

obj2 = mysql.from_conf()

obj2.tell_info()

物件導向之封裝

定義 影藏事物的屬性和實現的細節,僅對外提供公共的訪問方式 封裝的好處 1.隱藏了事物的細節 2.提高了 的復用性 3.提高了安全性 封裝的實現 使用private關鍵字進行修飾,被private修飾的成員只能在本類中使用 setter和getter 封裝需要搭配set和get方法 set 設定器 ...

物件導向之封裝

封裝之如何隱藏屬性 在變數名和方法名之前加雙下劃線 外部就訪問不到 classa x 1def init self,name self.name name def bar self print self.name a.x 外部無法訪問這其實是在類定義的時候,將變數名和函式名進行了變形,我們可以列印類...

物件導向之 封裝

封裝 就是把屬性或者方法裝起來 廣義 把屬性和方法裝起來,外面不能直接呼叫了,要通過類的名字來呼叫 狹義 把屬性和方法藏起來,外面不能呼叫,只能在內部偷偷呼叫 class user def init self,name,passwd self.usr name self.pwd passwd 私有的...