我正在学习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__())
先感谢您!
这应该做到这一点。请注意,我简化了A类和B类的逻辑。
class A():
# name and cost are constructor arguments
def __init__(self, name, cost):
self.name = name
self.cost = cost
我们已经删除了_name
和_cost
是因为当我们调用一个新的A类实例时,我们想要为name
和cost
赋值,这在__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类的一个实例。所以它将有一个name
和cost
变量。
你目前在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))