1. 程式人生 > 其它 >7.13學習日記

7.13學習日記

今日內容

繫結方法
1.繫結給物件的
2.繫結給類的
繫結給物件
class Student():
country = 'China'
def __init__(self,name,age):
self.name1 = name
self.age = age

def tell_info(self):
print('%s-%s' % (self.name, self.age))

obj = Student('egon', 30)
obj.tell_info() #物件呼叫方法,不需要再傳引數

Student.tell_info(obj) #類呼叫方法,要傳引數
繫結給類的
import settings
class Mysql():
country = 'China'
def __init__(self,ip,port):
self.ip = ip
self.port = port

def tell_info(self):
print('%s-%s' % (self.ip, self.port))

# 類方法是繫結給類的,類來呼叫,把類名當作第一個引數傳遞 用到類名就寫裝飾器
@classmethod
# 原理 cls =》 Mysql(類名)
def from_config(cls):
obj = cls(setting.IP, setting.PROT)
return obj

obj = Mysql('127.0.0.1',80)
Mysql.from_config()

# 不管繫結給誰,都只能傳一個引數
# 如果想要既傳類又傳物件 就繫結給物件
# self.__class__ 找到產生物件的類
非繫結方法

非繫結方法:不繫結給物件,也不繫結給類

# 呼叫方法引數該怎麼傳就怎麼傳
class Mysql():
def __init__(self,ip,port):
self.ip = ip
self.port = port

@staticmethod # 靜態方法,類呼叫的時候才要用
def create_id():
import uuid
print(uuid.uuid4())

obj = Mysql('127.0.0.1',3306)
Mysql.create_id()
uuid模組

隨機字串,基本上永不重複

隱藏屬性
1、如何隱藏
# 原理
# 在類定義階段,把隱藏物件語法變形,只要改變語法還可以使用
# __country -> _People__country
# 該隱藏對外不對內
# 原理是在定義階段,掃描到呼叫隱藏物件的語句時,依舊會語法變形,所以可以直接呼叫
# 如果想訪問類中的隱藏屬性,在類中開放對外的介面,可以更好的對外部做限制
#變形操作只在類定義階段,之後的所有屬性或者方法,都不會變形

class People():
__country = 'China' # __即隱藏物件
def __init__(self,name,age):
self.name1 = name
self.age = age

def __func(self): # _People__func
print('func')

#如果外部想呼叫
def get_country(self):
return self.__country
# self._People__country

def set_country(self,v):
if type(v) is not str:
print("country必須是str型別")
return
self.__country = v

obj = People('ly', 18)
print(obj.get_country())
2、為什麼要隱藏

1:封裝資料:將資料隱藏起來這不是目的。隱藏起來然後對外提供操作該資料的介面,然後我們可以在介面附加上對該資料操作的限制,以此完成對資料屬性操作的嚴格控制。

2:封裝方法:目的是隔離複雜度

取款是功能,而這個功能有很多功能組成:插卡、密碼認證、輸入金額、列印賬單、取錢
對使用者來說,只需要知道取款這個功能即可,其餘功能我們都可以隱藏起來,很明顯這麼做
隔離了複雜度,同時也提升了安全性
補充:python3中統一了類與型別的概念
l1 = list([1,2,3])

l1.append(4) # list.append(l1,4)
peoperty裝飾器
# 將一個函式功能偽裝成一個數據屬性
例1
class People():
__country = 'China'
def __init__(self,name,age):
self.__name = name
self.age = age

@peoperty
def name(self):
return self.__name

@name.setter # 修改的時候,也必須寫上面的名字
def name(self, v):
if type(v) is not str:
print("country必須是str型別")
return
self.__name = v

@name.deleter
def name(self):
print('不能刪除')

obj = People('ly', 18)
obj.name = 'x'
print(obj.name)

例2
class People():
__country = 'China'
def __init__(self,name,age):
self.__name = name
self.age = age

def get_name,(self):
return self.__name

def nset_name(self, v):
if type(v) is not str:
print("country必須是str型別")
return
self.__name = v

def del_name(self):
print('不能刪除')

# 必須按照這個順序寫(獲取,修改,刪除)
xxx = property(get_name,set_name,del_name)

obj = People('ly', 18)
print(obj.xxx)
obj.xxx = 'egon'
print(obj.xxx)
del obj.xxx
面向物件的三大特徵
封裝,繼承,多型
繼承
1.什麼是繼承
繼承就是一種新建類的方式
新建的類稱為子類或者叫派生類
被繼承的類稱為父類或者叫基類
子類可以遺傳父類的屬性
2.為什麼用繼承
類解決物件與物件之間的程式碼冗餘問題
繼承解決類與類之間的程式碼冗餘的問題
3.如何使用繼承
python支援多繼承

經典類:沒有繼承object類的子子孫孫類都是經典類
新式類:繼承了object以及該類的子子孫孫類都是新式類

python2中才區分新式類和經典類
python3都是新式類


class Pareent1:
pass

class Pareent2:
pass

class Sub1(Pareent1):
pass

class Sub2(Pareent1,Pareent2):
pass

print(Sub1.__base__)
print(Sub2.__bases__)

繼承的案例
class people()
schOOl = "SH"
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender

class Student(people):

#遞迴
def __init__(self, name, age, gender, course = None):
if course is None:
self.course = []
#self.__init__()
People.__init__(self, name, age, gender)


def choose_course(self,course):
self.course.append(course)
print('%s 選課成功 %s' % (self.name, self.courses))

class Teacher(people):
def __init__(self, level):
People.__init__(self, name, age, gender)
self.level = level

def score(self, stu_obj, num):
stu_obj.num = num
print('%s老師給%s打了%s分' % (self, name, stu_obj, num))


stu1 = Student('tom', 19, 'male')
tea1 = Teacher('tom', 19, 'male')

子類如何使用父類的屬性
方式1:指名道姓的使用父類,跟繼承沒有關係
方式2:嚴格以來繼承 super()