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. 實例變量是在實例對象初始化之後纔有的,不能通過類本身調用,所以也不存在通過類本身改變其值,實例成員屬於實例本身,同一個類的不同實例對象的實例成員也就自然是各自獨立的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章