1. 程式人生 > >python學習筆記21(類與物件的屬性)

python學習筆記21(類與物件的屬性)

類與物件的屬性

物件屬性與類屬性

class Person(object):
    # 這裡的屬性實際上屬於類屬性(用類名來呼叫)
    name = "person"
    def __init__(self, name):
        pass
        #物件屬性
        self.name = name
print(Person.name)
#輸出:person
per = Person("tom")
print(per.name)    #物件屬性的優先順序高於類屬性
#輸出:tom
#刪除物件中的name屬性,再呼叫會使用到同名的類屬性
del per.name
print(per.name)
#輸出:person

注意: 以後千萬不要將物件屬性與類屬性重名,因為物件屬性會遮蔽掉類屬性。但是當刪除物件屬性後,再使用又能使用類屬性了

動態的給物件新增物件屬性

per.age = 18#只針對於當前物件生效,對於類建立的其他物件沒有作用
print(per.age)
#輸出:18
per2 = Person("lilei")
print(per2.age)  #沒有age屬性

使用types模組下的MethodType方法動態的給物件新增方法

from types import MethodType

#建立一個空類
class Person(object):
    pass

per = Person()
#動態新增屬性,這體現了動態語言的特點(靈活)
per.name = "tom"
print(per.name)
#輸出:tom
#動態新增方法
def say(self):
    print("my name is " + self.name)
per.speak = MethodType(say, per)
per.speak()
#輸出:my name is tom

_slots_: 定義類的時候,定義一個特殊的屬性(slots),可以限制動態新增的屬性

#建立一個空類
class Person(object):
    __slots__ = ("name", "age", "speak")

per = Person()
per.height = 170
print(per.height)
#輸出:AttributeError: 'Person' object has no attribute 'height'

在有些情況下需要對給定的外部引數進行過濾,如輸入一個物件的年齡時要求輸入的必須為正數,常採用限制訪問的方式

class Person(object):
    def __init__(self, name, age):
        #屬性直接對外暴露
        #self.age = age
        #限制訪問
        self.__age = age
        self.__name = name
    def getAge(self):
        return self.__age
    def setAge(self, age):
        if age < 0:
            age = 0
        self.__age = age    

#使用限制訪問,需要自己寫set和get方法才能訪問
per = Person("Tom",15)
print(per.getAge())
#輸出:15
per.setAge(-5)
print(per.getAge())  
#輸出:0 

使用@property修飾器,讓你對受限制訪問的屬性使用點語法

class Person(object):
    def __init__(self, name, age):
        #屬性直接對外暴露
        #self.age = age
        #限制訪問
        self.__age = age
        self.__name = name
    @property
    def age(self):
        return self.__age
    @age.setter  #age去掉前面的雙下劃線,後面加.setter
    def age(self, age):
        if age < 0:
            age = 0
        self.__age = age

per = Person("Tom",15)
print(per.age) #相當於呼叫getAge
#輸出:15
per.age = -5
print(per.age)
#輸出:0