一、私有變量和私有方法
私有屬性分爲兩類分別是對象的私有變量以及類的靜態私有變量,除了變量外,還有私有方法;在類中,所有私有的屬性和方法都是在變量的左邊加上雙下劃線的方式定義,所有的私有變量和私有方法都不能在類的外部使用
class Person():
__pwd = "123456" # 私有靜態變量
def __init__(self,name,price):
self.name = name
self.__price = price # 私有變量
# 私有方法
def __add_price(self):
return self.__price*2
eric= Person("eric",20000000)
# 私有變量和方法無法在外部調用,雖然可以通過_類名__屬性名方式調用私有變量,但不提倡使用
print(eric._Person__price)
print(eric._Person__pwd)
print(eric._Person__add_price())
20000000
123456
40000000
二、類的屬性
python的屬性其實是普通方法的變種
有兩種定義方式:
1、普通方法加上property裝飾器
2、在類中定義值爲property對象的靜態字段
property裝飾器方式
property是一種特殊的屬性,當我們訪問被property裝飾的函數時,執行函數內的代碼,得到返回值。
from math import pi
class Circle():
def __init__(self,radius):
self.radius = radius
@property
def perimeter(self):
return 2*pi*self.radius
@property
def area(self):
return self.radius**2*pi
c1 = Circle(5)
# 未帶裝飾器調用方法
# print(c1.area())
# 帶裝飾器時當成屬性調用
print(c1.area)
使用property裝飾器定義屬性時,要注意被property裝飾的普通方法只能有self一個參數,並且在調用時不需要加()。
在python3之後,所有的類默認繼承了object,所以說,所有的類都是新式類,新式類的property有三種訪問方式,並分別對應了三個被@property、@方法名.setter、@方法名.deleter修飾的方法
class Goods(object):
def __init__(self):
# 原價
self.original_price = 100
# 折扣
self.discount = 0.8
@property
def price(self):
# 實際價格 = 原價 * 折扣
new_price = self.original_price * self.discount
return new_price
@price.setter
def price(self, value):
self.original_price = value
@price.deleter
def price(self):
del self.original_price
obj = Goods()
print(obj.price) # 獲取商品價格
obj.price = 200 # 修改商品原價
del obj.price # 刪除商品原價
靜態字段方式
靜態字段方式沒有新式類和經典類的區別;靜態字段定義方式也有三種訪問方式:分別對應了三個被@property、@方法名.setter、@方法名.deleter修飾的方法
class Person():
def __init__(self,name):
self.__name = name
def get_name(self):
return self.__name
def set_name(self,newname):
self.__name = newname
def del_name(self):
del self.__name
NAME = property(get_name,set_name,del_name) #定義property靜態字段
obj = Person("eric")
print(obj.NAME) #調用get_name方法
obj.NAME = "111" #調用set_name方法
del Person.NAME #調用del_name方法
三、類的方法
方法包括:普通方法、靜態方法和類方法,三種方法在內存中都歸屬於類,區別在於調用方式不同。
普通方法:由對象調用;至少一個self參數;執行普通方法時,自動將調用該方法的對象賦值給self;
類方法:由類調用; 至少一個cls參數;執行類方法時,自動將調用該方法的類複製給cls;
靜態方法:由類調用;無默認參數;
class Goods():
__discount = 0.8
def __init__(self,name,price):
self.name = name
self.__price = price
def price(self): # 普通方法
return self.__price*Goods.__discount
@classmethod
def change_discount(cls,new_discount): # 類方法
cls.__discount = new_discount
@staticmethod
def get_user_pwd(): #靜態方法
user = input('please input username: ')
pwd = input('please input pwd: ')
apple = Goods('apple',10)
Goods.change_discount(0.9) # 類方法調用
Goods.get_user_pwd() # 靜態方法調用
小結:
1、類方法
類方法是把一個方法,變成一個類中的方法,這個方法就直接可以被類調用,不需要通過對象來調用;
類方法一般用於只涉及操作靜態變量時使用。
2、靜態方法
一個函數,在與對象以及類沒什麼關係的情況下,要完全的面向對象編程,此時,就可以用staticmethod將這個函數變成類中的靜態方法。