021_面向對象的名稱空間

1,類裏面  能夠定義兩種屬性:
      靜態屬性
      動態屬性
class Course:
    language = 'Chinese'
    def __init__(self,teacher,course_name,period,price):
        self.teacher = teacher
        self.name = course_name
        self.period = period
        self.price = price
    def func(self):
        pass
Course.language = 'English'             #類的靜態屬性只能經過對象或類這種方式修改。不能經過字典
# Course.__dict__['language'] = 'Chinese'
# print(Course.language) 
2,命名空間
  2.1
  1. 類屬性的命名空間是是共享的,而對象的屬性命名空間,是每建立一個對象就開創一個本身的命名空間,只保存本身的對象屬性,不保存類屬性。各對象的命名空間相互獨立。
  2. 「類名.對象屬性」  Course.name 是不能用的。由於類不能使用對象的屬性的,對象須要類的屬性時,能夠向類尋找。
  3. 由於類的命名空間是各對象共享的,因此如經過「類名.類屬性」修改類屬性,那麼依靠這個類建立的實例化對象中在調用其類屬性都會相應改變。
  4. 若是,經過「對象名.類屬性」則類命名空間的該類屬性不會變(即共享空間的類屬性不會變)可是,這個對象會將這個類屬性添加到本身的命名空間,並將值修改,成爲本身的對象屬性。
    python = Course('egon','python','6 months',20000)
    linux = Course('oldboy','linux','6 months',20000)
    Course.language = 'Chinese'
    print(python.language)  #Chinese
    print(linux.language) #Chinese
    python.language = 'py'
    print(Course.language) #Chinese
    print(python.language) #py
    print(linux.language)   #Chinese
2.2
print(linux.__dict__) #查看linux對象名稱空間的名稱
print(python.__dict__) #查看python對象名稱空間的名稱

因而可知,python對象中多了一個屬性,若是想讓該屬性依然跟着大衆變化,就要 「del python.language」
del python.language
print(python.__dict__)
2.3
若是類屬性是可變數據類型,那麼經過對象修改可變數據類型中的一個元素,那麼就是修改了這個可變數據類型的元素。又由於對象中找類屬性,經過指向類中類屬性的地址,
類屬性又指向可變數據類型,列表的地址,而修改可變數據類型中元素,並不改變可變數據類型列表的地址,所以,經過對象修改可變數據類型的元素,就更改了類屬
class Course:
	language = ['Chinese']
	def __init__(self,teacher):
		self.teacher = teacher

python = Course('egon')		#['Chinese']
linux = Course('oldboy')	#['Chinese']
python.language[0] = 'English'
print(Course.language)		#['English']
python = Course('egon')		#['English']
linux = Course('oldboy') 	#['English']
python.language = ['English']	#這樣卻不會修改類屬性,由於這是創建一個新列表,一個新地址,和原列表不要緊。
python = Course('egon')  
linux = Course('oldboy')
2.4
# 類中的靜態變量 能夠被對象和類調用
# 對於不可變數據類型來講,類變量最好用類名操做
# 對於可變數據類型來講,對象名的修改是共享的,從新賦值是獨立的
 
3,認識綁定方法
def func():pass
print(func)
class Foo:
    def func(self):
        print('func')
    def fun1(self):
        pass
f1 = Foo()
print(Foo.func)  #除了對象,其它的都不能和func造成綁定關係。
print(f1.func)   #f1.func就是將f1與func方法綁定
# print(f1.fun1)
#<bound method Foo.func of f1>

  

4,
  對象須要的去類裏找,若是類裏沒有就沒有,不會向全局找。
5,
  組合 :一個對象的屬性值是另一個類的對象
相關文章
相關標籤/搜索