1. 程式人生 > 實用技巧 >繫結方法、類方法和靜態方法等相關內容-25

繫結方法、類方法和靜態方法等相關內容-25

day25

1.封裝

"""
1、封裝(略)
2、在封裝的基礎上,我可以將裝到物件或者類中的屬性給隱藏起來
注意:
(1)在定義類或者初始化物件時,在屬性前加__,就會將該屬性隱藏起來
但該隱藏起始只是一種變形_類名__屬性名,並沒有真的隱藏起來

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

(3)該隱藏是對外不對內

(4) 在繼承中,父類如果不想讓子類覆蓋自己的方法,可以將方法定義為私有的???
"""
# 例1
# class Student:
# __school = "oldboy" # _Student__school = "oldboy"
#
# def __init__(obj, x, y, z):
# obj.__name = x # obj._Student__name = x
# obj.age = y
# obj.gender = z
#
# def __choose(self): # obj._Student__choose
# print("%s 正在選課" %self.name)
#
# stu_obj1 = Student("馮瘋子", 18, "female")
# stu_obj1.__x=111
# print(stu_obj1.__dict__)
# print(stu_obj1.__x)

# print(stu_obj1.__dict__)
# print(stu_obj1._Student__name)

# print(Student.__dict__)
# print(Student._Student__school)
# print(stu_obj1._Student__school)

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

# class Student:
# __school = "oldboy" # _Student__school = "oldboy"
#
# def __init__(obj, x, y, z):
# obj.__name = x # obj._Student__name = x
# obj.__age = y
# obj.gender = z
#
# def __choose(self): # obj._Student__choose
# print("%s 正在選課" % self.name)
#
# def get_name(self):
# print(self.__name) # print(self._Student__name)
#
# def set_age(self,x):
# if type(x) is not int:
# print("年齡必須是整型,傻叉")
# return
# self.__age = x
#
# def get_age(self):
# print(self.__age)
#
# def del_age(self):
# del self.__age
#
# stu_obj1 = Student("馮瘋子", 18, "female")
# # stu_obj1.get_name()
#
#
# # stu_obj1.set_age("asfdasfdasfafd")
# stu_obj1.set_age(19)
# stu_obj1.get_age()
# # print(stu_obj1.__dict__)

# 2、把功能屬性隱藏起來:隔離複雜度
# class ATM:
# def __card(self):
# print('插卡')
# def __auth(self):
# print('使用者認證')
# def __input(self):
# print('輸入取款金額')
# def __print_bill(self):
# print('列印賬單')
# def __take_money(self):
# print('取款')
#
# def withdraw(self):
# self.__card()
# self.__auth()
# self.__input()
# self.__print_bill()
# self.__take_money()
#
# a=ATM()
# a.withdraw()

2.property

# 例1
# 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
# print(p.bmi())

# 例2
# class Student:
# __school = "oldboy" # _Student__school = "oldboy"
#
# def __init__(obj, x, y, z):
# obj.__name = x
# obj.__age = y
# obj.gender = z
#
# def get_name(self):
# print("訪問控制")
# return self.__name
#
# def set_name(self,x):
# print("賦值控制")
# self.__name = x
#
# def del_name(self):
# print("刪除控制")
# del self.__name
#
# def get_age(self):
# return self.__age
#
# def set_age(self, x):
# if type(x) is not int:
# print("年齡必須是整型,傻叉")
# return
# self.__age = x
#
# def del_age(self):
# print("不讓刪")
#
#
# age = property(get_age, set_age, del_age)
# name = property(get_name, set_name, del_name)
#
#
# stu_obj1 = Student("馮瘋子", 18, "female")
#
# # print(stu_obj1.age)
# # stu_obj1.age = "19"
# # del stu_obj1.age
# # print(stu_obj1.age)
#
#
# print(stu_obj1.name)
# # stu_obj1.name="EGON"
# # del stu_obj1.name

# 例3:
class Student:
__school = "oldboy" # _Student__school = "oldboy"

def __init__(obj, x, y, z):
obj.__name = x
obj.__age = y
obj.gender = z

@property
def name(self):
print("訪問控制")
return self.__name

@name.setter
def name(self, x):
print("賦值控制")
self.__name = x

@name.deleter
def name(self):
print("刪除控制")
del self.__name


stu_obj1 = Student("馮瘋子", 18, "female")

stu_obj1.name

3.繫結方法與非繫結方法

# 類中的定義的函式
# 1 繫結方法:誰來呼叫就會將誰當作第一個引數傳入
# (1)繫結給物件的方法:類中定義的函式預設就是繫結給物件的方法,應該是由物件呼叫,會把物件當作第一個引數傳入
# (2)繫結給類的方法:在類中的函式上加一個裝飾器@classmethod,該函式就繫結給類了,應該是由類來呼叫,會把類當作第一個引數傳入

# 2 非繫結方法:既不與類繫結也不與物件繫結,就是一個普通的函式,誰都可以來呼叫,沒有自動傳參的效果,
# 在函式上新增裝飾器@staticmethod
#
# class People:
# def __init__(self, name, age):
# self.name = name
# self.age = age
#
# def tell_info(self):
# print("<%s:%s>" % (self.name, self.age))
#
# @classmethod
# def f1(cls):
# print(cls)
#
# @staticmethod
# def f2(x,y,z):
# print(x,y,z)
#
#
# p1=People('egon',18)
# # p1.tell_info()
#
# # print(p1.tell_info)
# # print(People.f1)
#
# # People.f1()
#
# # print(p1.f2)
# # print(People.f2)
# p1.f2(1,2,3)
# People.f2(1,2,3)

# 例如:
import uuid
import settings

class MySQL:
def __init__(self,ip,port):
self.mid = self.__create_id()
self.ip = ip
self.port = port

def tell_info(self):
print("%s:<%s:%s>" %(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.10.11.11",3306)
# obj.tell_info()


obj1=MySQL.from_conf()
obj1.tell_info()