Производный класс не имеет доступа к функциям элемента базового класса, если только я не ошибаюсь. Полученный класс также может получить доступ к атрибутам своего базового класса, предварительно назначив их следующим вызовам: BaseClass.base_attribute. Но я, кажется, не понимаю, как экземпляры производного класса могут использовать методы базового класса. Пример:Каков порядок пространств имен в наследовании?
class Visitor():
""" Interface to Visitor
provide an interface to visitors that
perform an operation on a data collection """
def visitProduce():
pass
def visitMeat():
pass
def visitBakedGoods():
pass
def visitDairy():
pass
def visitNonFood():
pass
class PriceVisitor(Visitor):
__cost = 0.0 # total cost of groceries
def __init__(self):
self.__cost = 0.0
def visitProduce(self, p):
self.__cost += p.price()
def visitMeat(self, m):
self.__cost += m.price()
def visitBakedGoods(self, b):
self.__cost += b.price()
def visitDairy(self, d):
self.__cost += d.price()
def visitNonFood(self, nf):
self.__cost += nf.price()
class Groceries():
shopping_cart = [] # list of grocery items
def Groceries(self):
self.shopping_cart = []
def addProduce(self, p):
pass
def addMeat(self, m, lb):
pass
def addBakedGoods(self, b):
pass
def addDairy(self, d):
pass
def addNonFood(self, nf):
pass
def accept(self, v):
pass
def getShoppingCart(self):
print(self.shopping_cart)
def calculateCost(self, v):
for item in self.shopping_cart:
item.accept(v)
item.details()
print('Total cost is: $', v.__cost)
class Produce(Groceries):
def addProduce(self):
Groceries.shopping_cart.append(self)
def accept(self, v):
v.visitProduce(self)
def price(self):
return self.__price
def details(self):
print(self.__name, ' for: $', self.__price + '')
class Apples(Produce):
__name = None
__price = 3.25
def __init__(self, name):
self.__name = name
А вот тест Apple, продукты, бакалейные товары, и PriceVisitor классы
import VisitorPattern as vp
def main():
# Visitor object
my_visitor = vp.PriceVisitor()
# Grocery object stores objects in its shopping_cart attribute
my_groceries = vp.Groceries()
# Add items
red_apple = vp.Apples('red apple')
gold_apple = vp.Apples('gold apple')
red_apple.addProduce()
gold_apple.addProduce()
my_groceries.getShoppingCart()
my_groceries.calculateCost(my_visitor)
if __name__ == '__main__':
main()
Теперь, как я понимаю, что при построении экземпляра Apple, он имеет доступ к цене метода продукта(). Вызов этого метода с экземпляром класса Apple затем передаст свой собственный экземпляр вместо «я». Затем программа возвращает значение атрибута __price, принадлежащего экземпляру, вызывающему этот метод, в данном случае Apple. Тем не менее, я получаю эту ошибку:
C:\Users\josep_000\Documents\School\Summer 2015\Python Assignment 4>python test.
py
[<VisitorPattern.Apples object at 0x026E0830>, <VisitorPattern.Apples object at
0x026E0910>]
Traceback (most recent call last):
File "test.py", line 23, in <module>
main()
File "test.py", line 20, in main
my_groceries.calculateCost(my_visitor)
File "C:\Users\josep_000\Documents\School\Summer 2015\Python Assignment 4\Visi
torPattern.py", line 60, in calculateCost
item.accept(v)
File "C:\Users\josep_000\Documents\School\Summer 2015\Python Assignment 4\Visi
torPattern.py", line 71, in accept
v.visitProduce(self)
File "C:\Users\josep_000\Documents\School\Summer 2015\Python Assignment 4\Visi
torPattern.py", line 28, in visitProduce
self.__cost += p.price()
File "C:\Users\josep_000\Documents\School\Summer 2015\Python Assignment 4\Visi
torPattern.py", line 74, in price
return self.__price
AttributeError: 'Apples' object has no attribute '_Produce__price'
Каким образом связывание и пространства имен действительно работают в наследовании? Я мог бы просто написать метод price() в каждом из производных классов Produce, но это победит точку наследования. Я думаю, что моя проблема также связана с изменением имени, но до сих пор не знаю, что произойдет, если я не сделаю свои атрибуты «частными». Уточнение было бы замечательным. Благодаря
Редактировать
Я объявил конструктор Бакалея неправильно:
# Wrong way
def Groceries(self):
self.shopping_cart = []
# Should be
def __init__(self):
self.__shopping_cart = []
Продукт полного времени работы и домашних заданий вечером
Я все еще должен программировать с C++: хорошо ли иметь атрибуты класса, или лучше оставить его для экземпляра, чтобы создать свой собственный атрибут? – Joe
Я бы не назвал это хорошей практикой, но я не вижу причин, чтобы не иметь его в некоторых случаях. По общему признанию, я едва использовал атрибуты и методы класса в своем опыте работы с Python, поэтому я не думаю, что у меня есть возможность ответить на это за вас. – Manhattan