python類成員變數和例項成員變數
阿新 • • 發佈:2019-02-04
# 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的屬性:
- 例項物件c2定義後尚未修改過類成員(本例中test)之前,c2並沒有自己的類成員副本,而是和類本身(class Car)共享,當類Car改變成員test時,c2的成員test自然也是改變的;
- 當例項物件中的類成員修改時,該物件才擁有自己單獨的類成員副本,此後再通過類本身改變類成員時,該例項物件的該類成員不會隨之改變;
- 例項變數是在例項物件初始化之後才有的,不能通過類本身呼叫,所以也不存在通過類本身改變其值,例項成員屬於例項本身,同一個類的不同例項物件的例項成員也就自然是各自獨立的。