Python:類屬性,例項屬性,私有屬性與靜態方法,類方法,例項方法
1、定義一個類:
class className:
block
block裡面定義屬性和方法,當類定義完之後,就產生了一個類物件。
1.1、類物件支援兩種操作:引用和例項化- 引用操作:通過類物件呼叫類中的屬性或者方法
- 例項化:產生出一個類物件的例項
下面定義一個類:
#定義一個類
class user:
name = 'Jason'
nickname = 'arthinking'
def getName(self):
return self.name
#引用操作:
print user.name #Jason
#例項化
u = user() #例項化一個類物件
print u.name #Jason
1.2、Python中屬性、方法和函式的區別:
屬性:類中定義的變數,如上面的name;
方法:與某個物件進行繫結的函式,一把在類裡面定義的函式與類物件或者例項物件繫結;
函式:在類外定義的函式,沒有同對象進行繫結。
1.2.1、私有屬性:想把屬性宣告為私有的,可以再屬性簽名加兩個下劃線"__",這樣就不能直接訪問了。
class user2:
__name = 'Jason'
def getName(self):
return self.__name
u2 = user2()
print u2.getName()
#print u2.__name #AttributeError: user2 instance has no attribute '__name'
1.2.2、方法:
類中定義方法,同樣使用def關鍵字,類中的方法至少有一個引數,一般以'self'的變數作為該引數,而且需要作為第一個引數,這個self就相當於物件自身的引用,和Java中的this類似。
私有方法:
同樣的,在方法前面加兩個下劃線,表示該方法是私有的
類內建方法:
Python中有一些內建的方法,這些方法命名一兩個下劃線開始和結束:
構造方法:__init__(self, ...)該方法在生成物件時進行一些初始化操作,無需顯示呼叫,該方法支援過載。
析構方法:__del__(self)在釋放物件時呼叫,在裡面進行一些釋放資源的操作,不需要顯示呼叫。支援過載。
__cmp__()
__len__()
1.3、類屬性、例項屬性、類方法和例項方法:類屬性:和Java中的靜態成員變數類似,對於共有的類屬性,在類外可以通過類物件和例項物件方法。
例項屬性:例項屬性是不需要在類中顯示定義的:
class user3:
__name= 'Jason'
def getName(self):
return self.__name
p3 = user3()
p3.age = 20
print p3.age #20
#print user3.age #AttributeError: class user3 has no attribute 'age'
上面建立了一個user3物件,並例項化,添加了一個age屬性,而user3並不能持有該屬性。
另外,也可以在例項化物件的時候給age賦值:
class user3:
__name='Jason'
def __init__(self, nickname):
self.nickname = nickname
u3 = user3(123)
print u3.nickname #123
#print user3.nickname #AttributeError: class user3 has no attribute 'nickname'
修改類屬性:
必須通過類物件去引用然後進行修改。如果通過例項物件去引用,會產生一個同名的例項屬性,該屬性會把類屬性給遮蔽掉,除非刪除了該屬性。
class user:
username = 'Jason'
print user.username #Jason
u = user()
print u.username #Jason
u.username = 'Mike'
print u.username #Mike
del u.username #刪除例項屬性,訪問到的則是類屬性
print u.username #Jason
1.3.1、類方法
類方法是類物件所擁有的方法,需要用修飾器"@classmethod"來表示其為類方法,第一個引數必須是類物件,類方法能夠通過例項物件和類物件去訪問:
class user:
username = 'Jason'
@classmethod
def getUsername(cls):
return cls.username
u = user()
print u.getUsername() #可以通過例項物件引用
print user.getUsername() #可以通過類物件引用
類方法可以對類屬性進行修改
class user:
username = "Jason"
@classmethod
def getUsername(cls):
return cls.username
@classmethod
def setUsername(cls, username):
cls.username = username
u = user()
print u.getUsername() #Jason
print user.getUsername() #Jason
u.setUsername("Mike") #通過類方法直接修改了類屬性
print user.getUsername() #Mike
1.3.2、例項方法
在類中最常定義的成員方法,至少有一個引數,並且必須以例項物件作為其第一個引數。例項方法只能通過類例項去呼叫:
class user:
username = 'Jason'
def getUsername(self):
return self.username
u = user()
print u.getUsername() #Jason
# print user.getUsername() #TypeError: unbound method getUsername() must be called with user instance as first argument (got nothing instead)
1.3.3、靜態方法
通過修飾器"@staticmethod"進行修飾,靜態方法無需多定義引數
class user:
username = 'Jason'
@staticmethod
def getUsername():
return user.username
print user.getUsername()
2、繼承
Python支援多繼承,如下:
class animal:
name = 'object'
class dog(animal):
nickname = 'Baby'
print dog.name #object
如果有多個父類,使用逗號隔開
class animal:
def __init__(self, name):
self.name = name
def getName(self):
return self.name
class role:
def __init__(self, name):
self.rolename = name
def getName(self):
return self.rolename
class cat(animal, role):
def __init__(self, name, nickname, rolename):
animal.__init__(self, name) #子類通過父類呼叫父類的共有方法或屬性
role.__init__(self, rolename)
self.nickname = nickname
def getNickname(self):
return self.nickname
c = cat('Jason', 'Tomcat', 'admin')
print c.name #Jason
print c.nickname #Tomcat
print c.rolename #admin
在Python中,如果父類和子類都重新定義了構造方法,在進行子類例項化的時候,子類的構造方法不會自動呼叫父類的構造方法,需要在子類中顯示呼叫
子類不繼承父類的私有屬性和方法,所以在子類中無法通過父類名來訪問父類的私有屬性和方法。
多重繼承的情況下,子類沒有定義建構函式時,會自動呼叫第一個父類的構造方法,包括多個父類有同名的方法時,優先選擇第一個父類的。