首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不同类的属性之间组合(或进行操作)(而不指定实例)?

如何在不同类的属性之间组合(或进行操作)(而不指定实例)?
EN

Stack Overflow用户
提问于 2016-08-12 17:00:50
回答 2查看 57关注 0票数 0

首先,我是个十足的新手。谢谢你的耐心。

我正在设计一个软件来计算不同房屋的绝缘材料和数量。

我有一个class House(),它包含像roof_area和wall_area这样的属性。

我有一个class Insulator(),它包含诸如厚度和面积(包装材料覆盖的区域)等属性。

现在我想知道我应该买多少包绝缘子才能覆盖整个屋顶地区。

因此,行动将是:

代码语言:javascript
复制
House.roof_area / Insulator.area = insulator_packages_needed_for_roof

问题是我不能做那个手术

代码语言:javascript
复制
AttributeError: type object 'House' has no attribute 'roof_area'. 

当然,我可以将它作为一个实例作用域,但我还不想指定一个实例,因为这个操作应该针对将来构建的类的任何实例执行。我应该使用继承吗?我的感觉是,考虑到绝缘子和房子是完全不同的东西,他们不应该混为一谈,但我只是一个初学者。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-12 18:34:32

在不使用HouseInsulator类实例的情况下,试图计算需要覆盖房屋屋顶的绝缘包的数量是没有任何意义的。只有当每个实例都有一个实例时,这才有意义。

但是,您可以在创建实例之前编写代码来进行计算。只需将其放入一个将实例作为参数的函数:

代码语言:javascript
复制
def roof_insulation_packages(house, insulator):  # args are instances of House and Insulator
    return house.roof_area / insulator.area  # do the calculation and return it

函数作为其中一个类的方法可能更有意义。我甚至建议Insulator实例可以成为House的实例属性。看起来是这样的:

代码语言:javascript
复制
class House():
    def __init__(self, roof_area, roof_insulator, wall_area, wall_insulator):
        self.roof_area = roof_area
        self.roof_insulator = roof_insulator
        self.wall_area = wall_area
        self.wall_insulator = wall_insulator

    def calculate_roof_insulation_packages(self):
        return self.roof_area / self.roof_insulator.area

    def calculate_wall_insulation_packages(self, insulator):
        return self.wall_area / self.wall_insulator.area

您可以使用这样的方法创建house实例(我正在为Insulator类编参数,所以不要过多地关注这个部分):

代码语言:javascript
复制
good_roof_insulation = Insulator(4, 5) # nonsense args
cheap_wall_insulation = Insulator(5, 12)

my_house = House(100, good_roof_insulation, 87, cheap_wall_insulation)
票数 1
EN

Stack Overflow用户

发布于 2016-08-12 17:13:07

如果您想使用属性而不创建实例,则应该使用类属性。

代码语言:javascript
复制
class House(object):
    roof_area = 10 # Or whatever you see fit.
    roof_surface = 20

class Insulator(object):
    thickness = 10 # Or whatever you see fit.
    surface = 20

通过这种方式,您可以通过输入'House.roof_area‘来访问属性。

不过,我不明白为什么您不能创建一个实例。它将防止类属性中的重新编码,并且在您的情况下会容易得多。

另外,您的操作不是有效的语法,但可能只是显示了伪代码。适当的语法是:

代码语言:javascript
复制
insulator_packages_needed_for_roof = House.roof_area / Insulator.area
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38923102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档