Python - 实例作为属性

时间:2017-09-24 02:12:56

标签: python class

当我学习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()

如果我理解正确,第一个“坦克”应该是“坦克”类。那我为什么要小写呢?我试过大写,代码不起作用。

2 个答案:

答案 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中的对象