我正在学习使用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__())
提前谢谢!
答案 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的新实例时将值分配给name
和cost
,这是在__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的一个实例。因此它将具有一个name
和cost
变量。
答案 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))