面向物件-02
阿新 • • 發佈:2020-08-21
'''
1.類的成員
class Foo:
# 構造方法
def __init__(self, name):
self.name = name #例項變數/欄位
# 普通方法
def func(self):
pass
# obj是Foo類的物件,或稱為Foo類的例項
obj = Foo('實參')
2.成員共分為三類:
變數:
-例項變數(欄位)
-公有變數
-私有變數:用'__'把變數私有化
-類變數(靜態欄位)
-公有變數
-私有變數:用'__'把變數私有化,類外無法呼叫,只能在類裡面被呼叫.且私有變數無法被子類繼承,也即子類也無法呼叫,只能父類呼叫
class Foo:
#類變數/靜態欄位
country = '中國'
def __init__(self, name):
self.name = name #例項變數/欄位
Foo.country = '中國' #類變數可直接通過 類名.類變數 的方法呼叫,當然用obj也可以呼叫
注意:方法中的私有變數只有該方法能夠呼叫,類中的私有變數只有該類才能呼叫,就算是在該類中的方法也無法直接呼叫
class B:
__a = 13
def f1(self):
__b = 13
def f2(self):
b = B.__a + 2 #只有通過類名才可呼叫該類中的私有變數,該類中的方法也無法不通過類名直接呼叫
b = B.__b #__b屬於f1的私有變數,除了f1外,其他方法和類都無法呼叫,因此這裡會報錯.
print(b)
obj = B()
obj.f2()
方法:
-例項方法
-靜態方法
-類方法
何時寫例項方法?
當方法需要使用物件中封裝的值時,可以用例項方法.也即方法中有呼叫構造方法中的例項變數時.
class Foo(object):
def __init__(self, name):
self.name = name
def func(self):
print(self.name) #func中有呼叫__init__中封裝的屬性,因此可以說是例項方法,當未呼叫時,不能成為例項方法
obj = Foo('alex')
obj.func()
靜態方法:
當方法中無需使用物件中封裝的值時,可以選擇靜態方法.
class Foo(object):
def __init__(self, name):
self.name = name
@staticmethod
def display(): # 靜態方法前需要加@staticmethod,且靜態方法可以沒有引數,當然加上引數也可以.
print('999') # 靜態方法只能被物件呼叫,而例項方法物件和類都可以呼叫,這也是二者的區別.
類方法:
如果你需要在你的方法中用到你當前的這個類時,可以選擇類方法.
class Foo(object):
def __init__(self, name):
self.name = name
@classmethod
def show(cls, x1, x2): #同例項方法中必有一個self引數一樣,類方法中必有一個cls引數.
print(cls, x1, x2) #類方法在傳參時不用傳cls位置的引數,這個系統會自動把當前類傳進去
Foo.show(1,8) #用 類名.方法() 的方式進行呼叫
靜態方法/類方法 和例項方法的區別是什麼?
1.定義時不同,例項方法前無@等屬性
2.呼叫時不同,例項方法需要先例項化物件,在通過物件來呼叫,但靜態方法和類方法可直接通過類名來呼叫.
3.使用環境不同,當你的方法中不需要用到物件封裝的屬性時,用靜態方法,且當需要用到當前類時用類方法,否則用例項方法.
私有方法:
私有例項方法:
class Foo(object):
def __init__(self, name):
self.name = name
def __display(self, arg):
print('私有方法', arg)
obj = Foo()
obj.__display() #此句會出錯,因為__display屬於私有方法,無法在外部被訪問
私有靜態方法:
class Foo(object):
def __init__(self, name):
self.name = name
@staticmethod
def __display(arg):
print('私有靜態方法', arg)
def func(self):
Foo.__display(123) #在類的內部可以呼叫私有方法
Foo.__display(123) #此句會報錯,因為__display作為私有方法,無法在類外被訪問
屬性:
-公有屬性
-私有屬性
class Foo(object):
def __init__(self, name):
self.name = name
@property
def start(self): #屬性不可以加引數的,只能有一個self,且前面需要有個@property
return 1
obj = Foo()
obj.start #屬性方法在呼叫時是不需要加括號的,也即當你需要呼叫一個方法,不需要往裡面傳參且需要該方法給你一個返回值時,建議用屬性方法.
'''