你怎么用班级打电话给不同的班级?

问题描述 投票:1回答:2

我正在学习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__())

先感谢您!

python python-3.x class
2个回答
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)。现在你有一个名为“product”的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变量。


0
投票

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

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))
© www.soinside.com 2019 - 2024. All rights reserved.