2016-08-12 3 views
0

Прежде всего, я новичок. Спасибо за ваше терпение.Как я могу объединить (или сделать операции) между атрибутами разных классов (без указания экземпляров еще)?

Я проектирую часть программного обеспечения для расчета изоляционных материалов и количества в разных домах.

У меня есть class House(), который содержит атрибуты, такие как roof_area и wall_area.

У меня есть class Insulator(), который имеет такие атрибуты, как толщина и площадь (площадь упакованного материала накрывает)

Теперь я хочу знать, сколько пакетов изолятора я должен купить, чтобы покрыть всю площадь крыши ,

Таким образом, операция будет:

House.roof_area/Insulator.area = insulator_packages_needed_for_roof 

Дело в том, что я не могу сделать эту операцию:

AttributeError: type object 'House' has no attribute 'roof_area'. 

Конечно, я мог бы сделать это область применения экземпляром, но дон Не хочу указывать экземпляр еще, поскольку эта операция должна быть выполнена для любого экземпляра класса, который будет создан в будущем. Должен ли я использовать наследование? Я чувствую, что, учитывая, что Изолятор и Хаус совершенно разные вещи, их нельзя смешивать по наследству, но я всего лишь новичок.

+0

Можете ли вы показать код для класса House? Ошибка указывает, что roof_area не является статичным и вместо этого устанавливается внутри метода или __init__ –

+0

. Вы можете просто сделать это с помощью метода внутри класса дома, что-то вроде 'def area (x): return self.roof_area/x.area ' –

ответ

1

Это не имеет никакого смысла, чтобы попытаться вычислить количество изолирующих пакетов, которые необходимо покрыть крышу дома, без использования каких-либо экземпляров ваших House или Insulator классов. Это имеет смысл только в том случае, если у вас есть один экземпляр каждого из них.

Вы можете, однако, написать код для расчета, прежде чем создавать экземпляры. Просто поместите его в функцию, которая принимает экземпляры в качестве аргументов:

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.Это будет выглядеть примерно так:

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 

Вы бы создать экземпляр дома с чем-то вроде этого (я готовлю на аргументы в Insulator класса, так что не обращайте слишком много внимания на ту часть) :

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) 
+0

Большое спасибо Blckknight. Ваше первое решение сработало для меня. –

0

Если вы хотите использовать атрибуты без создания экземпляра, вы должны использовать атрибуты класса.

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».

Хотя, я не понимаю, почему вы не можете создать экземпляр. Это предотвратит кодирование в атрибутах класса и будет в вашем случае намного проще.

Кроме того, ваша операция недопустима, но, возможно, вы просто указали псевдокод. Правильный синтаксис будет:

insulator_packages_needed_for_roof = House.roof_area/Insulator.area 

 Смежные вопросы

  • Нет связанных вопросов^_^