您如何使用课程来调用不同的课程?

时间:2019-04-05 17:56:20

标签: python python-3.x class

我正在学习使用python进行面向对象的编程,并且试图编写一个将B类作为A类变量的程序。我可以知道我的处理方法是否正确吗?

A类示例

Class A():
   _name = str
   _cost = int

   def __init__(self, _name, _cost):
       self.name = _name
       self.cost = _cost
   def name(self):
       return self.name
   def cost(self):
       return self.cost

B类示例

Class B():
   _a = A
   def __init__(self,_a):
      self.a = _a
   def __str__(self):
      return 'Phone Model: ', a.name, 'Cost: ', a.cost
phone= B('phone_X', 100)
print(phone.__str__())

提前谢谢!

2 个答案:

答案 0 :(得分:3)

这应该做到。请注意,我简化了类A和B的逻辑。

class A():

    # name and cost are constructor arguments
    def __init__(self, name, cost):
       self.name = name
       self.cost = cost

我们删除了_name_cost是因为我们想在调用类A的新实例时将值分配给namecost,这是在__init__。因此,当您要创建类A的实例时,可以分配如下值: product = A("phoneX",5)。 现在,您有一个名为“产品”的类A的实例,它具有name = "phoneX"cost = 5

class B():

    # Passing object of A as an argument
    def __init__(self, a):

      self.a = a

    # This function should return a string
    def __str__(self):
        return 'Phone Model: '+ self.a.name+ ' Cost: '+ str(self.a.cost)

# Instantiating object of A and passing it to B
a = A('phone_X', 100)
phone= B(a)
# Just printing the object would suffice
print(phone)
# Phone Model: phone_X Cost: 100

出于与删除类A中的_a_name变量相同的原因,我们删除了_cost。在此类的__init__中,您假设变量“ a”将是类A的一个实例。因此它将具有一个namecost变量。

答案 1 :(得分:0)

A模块从Python 3.7开始支持您目前在dataclasses中试图做的事情(声明每个实例变量的存在和类型)。

from dataclasses import dataclass

@dataclass
class A():
   name: str
   cost: int

在Python中,无需定义一个只返回实例属性值就什么都不做的方法。只需直接访问属性即可。

@dataclass
class B():
    _a: A

    def __str__(self):
        return f'Phone Model: {self._a.name}, Cost: {self._a.cost}'

现在,您可以将A的显式定义实例作为B的参数,然后将B的实例传递给str以获取字符串值

phone = B(A('phone_X', 100))
print(str(phone))