Python-实例作为属性

Python-实例作为属性,python,class,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.

当我学习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()
如果我理解正确,第一个“坦克”应该是指“坦克”类。那我为什么要把它小写呢?我尝试使用大写字母,但代码不起作用。

如果

class Car():
    def __init__(self, make, model):
        self.make = make
        self.model = model
        self.tank = Tank()

然后你可以调用
my\u car.tnk.tank\u info()

如果是

class Car():
    def __init__(self, make, model):
        self.make = make
        self.model = model
        self.t = Tank()
然后你可以调用
我的车.t.坦克信息()

因此,回答您的问题时,您指的不是
坦克类
,而是汽车类
成员,该成员属于坦克类
如果

class Car():
    def __init__(self, make, model):
        self.make = make
        self.model = model
        self.tank = Tank()

然后你可以调用
my\u car.tnk.tank\u info()

如果是

class Car():
    def __init__(self, make, model):
        self.make = make
        self.model = model
        self.t = Tank()
然后你可以调用
我的车.t.坦克信息()


因此,要回答您的问题,您指的不是类
坦克
,而是类
汽车
成员,该成员属于类
坦克
,因为属性将具有您赋予它的名称。一个可以给它与类名相同的名称,但通常避免这样做,按照惯例,属性在Python中是
snake\u 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>
>>类Foo:
...     通过
...
>>>分类栏:
...     定义初始化(自):
...         self.Foo=Foo()
...         self.foo=foo()
...         self.FOO=FOO()
...
>>>b=巴()
>>>b.foo
>>>b.富
>>>b.FOO
这是一个有三个属性的
Bar
对象的人为示例,这三个属性都是
Foo
的不同实例,我使用了不同的样式来命名它们


我认为您必须研究的一个基本问题是,您一直使用实例作为属性。一切都是实例
str
对象是类
str
的实例,
int
对象是类
int
的实例,
list
对象是类
list
的实例,就像
Foo
对象是类
Foo
的实例一样。在Python中,一切都是一个对象

因为属性将具有您指定的名称。一个可以给它与类名相同的名称,但通常避免这样做,按照惯例,属性在Python中是
snake\u 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>
>>类Foo:
...     通过
...
>>>分类栏:
...     定义初始化(自):
...         self.Foo=Foo()
...         self.foo=foo()
...         self.FOO=FOO()
...
>>>b=巴()
>>>b.foo
>>>b.富
>>>b.FOO
这是一个有三个属性的
Bar
对象的人为示例,这三个属性都是
Foo
的不同实例,我使用了不同的样式来命名它们


我认为您必须研究的一个基本问题是,您一直使用实例作为属性。一切都是实例
str
对象是类
str
的实例,
int
对象是类
int
的实例,
list
对象是类
list
的实例,就像
Foo
对象是类
Foo
的实例一样。在Python中,一切都是一个对象

my_car
car
的一个实例
my_car
有一个名为
tank
的属性,该属性在创建时被分配了一个
tank
的实例<代码>我的车油箱
正在访问my_car
tank
属性`.
self.tank=tank()
分配了一个实例
self.tank=tank
会自己分配这个类。@wwii非常感谢!!现在这是非常清楚的
my_car
car
的一个实例
my_car
有一个名为
tank
的属性,该属性在创建时被分配了一个
tank
的实例<代码>我的车油箱
正在访问my_car
tank
属性`.
self.tank=tank()
分配了一个实例
self.tank=tank
会自己分配这个类。@wwii非常感谢!!现在这是非常清楚的!!我明白了,所以坦克并不是指坦克类,而是指“self.tank”下的“坦克”。谢谢!!我明白了,所以坦克并不是指坦克类,而是指“self.tank”下的“坦克”。谢谢!!