1. 程式人生 > >Python中的類屬性、例項屬性與類方法、靜態方法

Python中的類屬性、例項屬性與類方法、靜態方法

1、什麼是類物件,例項物件

類物件:類名
例項物件:類建立的物件

2、類屬性就是類物件所擁有的屬性,它被所有類物件例項物件所共有,在記憶體中只存在一個副本,這個和C++、Java中類的靜態成員變數有點類似。對於公有的類屬性,在類外可以通過類物件例項物件訪問

類屬性

# 類屬性
class people:
    name="Tom"    #公有的類屬性
    __age=18      #私有的類屬性

p=people()
print(p.name)   #例項物件
print(people.name)  #類物件

# print(p.__age)    #錯誤 不能在類外通過例項物件訪問私有的類屬性
print(people.__age) #錯誤 不能在類外同過類物件訪問私有的類屬性

例項屬性
class people:
    name="tom"

p=people()
p.age=18

print(p.name)
print(p.age)    #例項屬性是例項物件特有的,類物件不能擁有

print(people.name)
#print(people.age)  #錯誤:例項屬性,不能通過類物件呼叫
也可以將例項屬性放在構造方法中
class people:
    name="tom"
    def  __init__(self,age):
        self.age=age

p=people(18)

print(p.name)
print(p.age)    #例項屬性是例項物件特有的,類物件不能擁有

print(people.name)
# print(people.age)  #錯誤:例項屬性,不能通過類物件呼叫


類屬性和例項屬性混合
class people:
    name="tom"      #類屬性:例項物件和類物件可以同時呼叫
    def  __init__(self,age):    #例項屬性
        self.age=age

p=people(18)    #例項物件
p.sex="男"       #例項屬性

print(p.name)
print(p.age)    #例項屬性是例項物件特有的,類物件不能擁有
print(p.sex)

print(people.name)  #類物件
# print(people.age)  #錯誤:例項屬性,不能通過類物件呼叫
# print(people.sex)  #錯誤:例項屬性,不能通過類物件呼叫



# 如果在類外修改類屬性,必須通過類物件去引用然後進行修改。如果通過例項物件去引用,
# 會產生一個同名的例項屬性,這種方式修改的是例項屬性,不會影響到類屬性,並且如果通過
# 例項物件引用該名稱的屬性,例項屬性會強制遮蔽掉類屬性,即引用的是例項屬性,除非刪除了該例項屬性
class Animal:
    name="Panda"

print(Animal.name)  #類物件引用類屬性
p=Animal()
print(p.name)       #例項物件引用類屬性時,會產生一個同名的例項屬性
p.name="dog"        #修改的只是例項屬性的,不會影響到類屬性
print(p.name)         #dog
print(Animal.name)    #panda

# 刪除例項屬性
del p.name
print(p.name)

class Test:

    num=100 #類屬性
    def __init__(self):
        self.age=18     #例項屬性

test1=Test()
test2=Test()
# test1.age=19
# test2.age=20
print(test1.num)    #100
test1.num=200       #如果通過物件去修改類屬性,那麼Python會自動給這個物件和這個類屬性相同名字的例項屬性
print(test1.num)    #200,只是修改了副本
print(Test.num)     #100

del test1.num        #刪除之後,仍能列印
print(test1.num)

3、類方法

是類物件所擁有的方法,需要用修飾器@classmethod來標識其為類方法,對於類方法,第一個引數必須是類物件,一般以cls作為第一個引數(當然可以用其他名稱的變數作為其第一個引數,但是大部分人都習慣以'cls'作為第一個引數的名字,就最好用'cls'了),能夠通過例項物件和類物件去訪問。

class people:
    country="china"

    @classmethod
    def getCountry(cls):
        return cls.country

p=people()
print(p.getCountry())   #例項物件呼叫類方法
print(people.getCountry())  #類物件呼叫類方法


類方法還有一個用途就是可以對類屬性進行修改:
class people:
    country="china"

    @classmethod
    def getCountry(cls):
        return cls.country
    @classmethod
    def setCountry(cls,country):
        cls.country=country


p=people()
print(p.getCountry())   #例項物件呼叫類方法
print(people.getCountry())  #類物件呼叫類方法

p.setCountry("Japan")

print(p.getCountry())
print(people.getCountry())

4、靜態方法

需要通過修飾器@staticmethod來進行修飾,靜態方法不需要多定義引數

class people3:
    country="china"

    @staticmethod
    def getCountry():
        return people3.country

p=people3()
print(p.getCountry())   #例項物件呼叫類方法
print(people3.getCountry())  #類物件呼叫類方法

從類方法和例項方法以及靜態方法的定義形式就可以看出來,類方法的第一個引數是類物件cls,那麼通過cls引用的必定是類物件的屬性和方法;而例項方法的第一個引數是例項物件self,那麼通過self引用的可能是類屬性、也有可能是例項屬性(這個需要具體分析),不過在存在相同名稱的類屬性和例項屬性的情況下,例項屬性優先順序更高。

靜態方法中不需要額外定義引數,因此在靜態方法中引用類屬性的話,必須通過類物件來引用