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. 实例变量是在实例对象初始化之后才有的,不能通过类本身调用,所以也不存在通过类本身改变其值,实例成员属于实例本身,同一个类的不同实例对象的实例成员也就自然是各自独立的。
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值