1. 程式人生 > >python類成員變數和例項成員變數

python類成員變數和例項成員變數

# python code class Vehicle:   def __init__(self,speed):   self.speed = speed #speed例項成員變數   def drive(self,distance):   print 'need %f hour(s)'% (distance/self.speed) class Bike(Vehicle):   pass class Car(Vehicle):   test = 'Car_original'   def __init__(self,speed,fuel):   Vehicle.__init__(self,speed)   self.fuel = fuel   def drive(self,distance):   Vehicle.drive(self,distance)   print 'need %f fuels'%(distance*self.fuel) b = Bike(16.0) c = Car(120,0.015) b.drive(200.0) c.drive(200.0) c2 = Car(120,0.015) c3 = Car(120,0.015) print print '情形1: c2中test成員尚未進行過修改,c3中對test進行過修改, car不變' c3.test = 'c3_test' print c2.test print c3.test print Car.test print print '情形2: c2尚未對類成員變數test進行過修改,類car中test成員改變' Car.test = 'Car_changed' print 'Car test: '+Car.test print 'c2 test: '+c2.test print 'c3 test: '+c3.test print print '情形3: c2 c3例項中都對test進行過修改,car中成員test再次改變' c2.test = 'c2_test' Car.test = 'Car_changed_again' print 'Car test: '+Car.test print 'c2 test: '+c2.test print 'c3 test: '+c3.test 執行結果: need 12.500000 hour(s) need 1.666667 hour(s) need 3.000000 fuels 情形1: c2中test成員尚未進行過修改,c3中對test進行過修改, car不變 Car_original c3_test Car_original 情形2: c2尚未對類成員變數test進行過修改,類car中test成員改變 Car test: Car_changed c2 test: Car_changed c3 test: c3_test 情形3: c2 c3例項中都對test進行過修改,car中成員test再次改變 Car test: Car_changed_again c2 test: c2_test c3 test: c3_test 分析; test是類變數 speed, fuel是例項變數 一個類的類變數為所有該型別成員共同擁有,可以直接使用型別名訪問(print Car.test),可以使用型別名更改其值(Car.test = 'Car_changed') 定義一個類的多個例項物件後(如c2,c3),類成員test的屬性:
  1. 例項物件c2定義後尚未修改過類成員(本例中test)之前,c2並沒有自己的類成員副本,而是和類本身(class Car)共享,當類Car改變成員test時,c2的成員test自然也是改變的;
  2. 當例項物件中的類成員修改時,該物件才擁有自己單獨的類成員副本,此後再通過類本身改變類成員時,該例項物件的該類成員不會隨之改變;
  3. 例項變數是在例項物件初始化之後才有的,不能通過類本身呼叫,所以也不存在通過類本身改變其值,例項成員屬於例項本身,同一個類的不同例項物件的例項成員也就自然是各自獨立的。