1. 程式人生 > >Python:類屬性,例項屬性,私有屬性與靜態方法,類方法,例項方法

Python:類屬性,例項屬性,私有屬性與靜態方法,類方法,例項方法

1、定義一個類:1.1、類物件支援兩種操作:引用和例項化1.2、Python中屬性、方法和函式的區別:1.2.1、私有屬性:1.3、類屬性、例項屬性、類方法和例項方法:1.3.1、類方法1.3.2、例項方法1.3.3、靜態方法2、繼承
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中,如果父類和子類都重新定義了構造方法,在進行子類例項化的時候,子類的構造方法不會自動呼叫父類的構造方法,需要在子類中顯示呼叫

子類不繼承父類的私有屬性和方法,所以在子類中無法通過父類名來訪問父類的私有屬性和方法。

多重繼承的情況下,子類沒有定義建構函式時,會自動呼叫第一個父類的構造方法,包括多個父類有同名的方法時,優先選擇第一個父類的。