python學習筆記21(類與物件的屬性)
阿新 • • 發佈:2019-01-09
類與物件的屬性
物件屬性與類屬性
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