当我学习Python速成课程时,书中没有回答的一个问题是使用实例作为属性。
让我举一个简单的例子:
class Car():
def __init__(self, make, model):
self.make = make
self.model = model
self.tank = Tank()
def get_car_info(self):
long_name = self.make + ' ' + self.model
print('The car is', long_name)
class Tank():
def __init__(self, tank_size=20):
self.tank_size = tank_size
def tank_info(self):
print('The tank size is', self.tank_size, 'gallons')
my_car = Car('Audi', 'S4')
my_car.get_car_info()
my_car.tank.tank_info()
>>>
The car is Audi S4
The tank size is 20 gallons
显然,我创建了两个名为Car和Tank的类,我想使用Tank类实例作为Car的一个属性。代码将成功,这里没问题。
但我注意到的是我调用Tank方法的代码:
my_car.tank.tank_info()
如果我理解正确,第一个“坦克”应该是“坦克”类。那我为什么要小写呢?我试过大写,代码不起作用。
答案 0 :(得分:1)
如果..
class Car():
def __init__(self, make, model):
self.make = make
self.model = model
self.tank = Tank()
是
class Car():
def __init__(self, make, model):
self.make = make
self.model = model
self.tnk = Tank()
然后你会打电话给my_car.tnk.tank_info()
如果是
class Car():
def __init__(self, make, model):
self.make = make
self.model = model
self.t = Tank()
然后你会打电话给my_car.t.tank_info()
。
为了回答您的问题,您 指的是课程Tank
,但指的是班级的成员 Car
,类型为Tank
答案 1 :(得分:1)
因为属性将具有您提供的名称 。一个可以赋予它与类名相同的名称,但通常可以避免这种情况,按照惯例,Python中的属性为snake_case
。但没有什么可以阻止你做类似的事情:
>>> class Foo:
... pass
...
>>> class Bar:
... def __init__(self):
... self.Foo = Foo()
... self.foo = Foo()
... self.FOO = Foo()
...
>>> b = Bar()
>>> b.foo
<__main__.Foo object at 0x1021c2710>
>>> b.Foo
<__main__.Foo object at 0x1021c26d8>
>>> b.FOO
<__main__.Foo object at 0x1021c2748>
这是Bar
对象的一个人为设想的示例,它有三个属性,这三个属性都是Foo
的不同实例,我使用不同的样式来命名每个属性。
我认为你必须理解的一个基本要素是你一直在使用实例作为属性。一切都是一个例子。 str
个对象是类str
的实例,int
个对象是类int
的实例,list
个对象是类list
的实例,就像Foo
个对象是类Foo
的实例。 一切都是Python中的对象。