vuex 動態路由下狀態儲存問題
阿新 • • 發佈:2020-09-08
[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"{self.__name}正在選課!") 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"{self.__name}正在選課") 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
四:propetry 把函式偽裝成屬性
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"{self.name}{self.age}")
@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"{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,1,2,3',3306)
obj.tell_info()
obj2 = MySQL.from_conf()
obj2.tell_info()