将面向过程的脚本转换为面向对象的编程脚本的问题

Problem in converting procedure oriented script to object oriented programing script

我想将(原始脚本)面向过程的脚本转换为面向对象的脚本,但是我在很多方面尝试了很多次,但每次都失败了我会写原始脚本然后我会写我的尝试

要求

  1. 自行车属性(描述和自行车成本和销售价格以及自行车状况)。

  2. 将自行车成本从 500 更新为 350。

面向过程:

def update_sale_price(bike, sale_price):
   if bike['sold'] == True:
       print('Action not allowed, Bike has already been sold')
   else:
       bike['sale_price'] = sale_price


def sell(bike):
    bike['sold'] = True


def create_bike(description, cost, sale_price, condition):
    return {
        'description': description,
        'cost': cost,
        'sale_price': sale_price,
        'condition': condition,
        'sold': False
    }


bike1 = create_bike('Univega Alpina, orange', cost=100, sale_price=500, condition=0.5)
update_sale_price(bike1, 350)
sell(bike1)
print(bike1)

面向对象(我的尝试):

class create_bike:
    def __init__(self, sale_price, description, cost, condition):
        self.sale_price = sale_price
        self.description = description
        self.cost = cost
        self.condition = condition

class update_sell_price:
    def __init__ (self, bike, sale_price):
        self.bike = bike
        self.sale_price = sale_price


bike1 = create_bike(description='Univega Alpina, orange', cost=100, sale_price=500, condition=0.5)

up = update_sell_price(bike=bike1, sale_price=350)

print(up)

代码中的概念“对象”是自行车字典——您应该做的是创建一个包含来自自行车字典的数据的单个 class,并创建该 class.

from dataclasses import dataclass

@dataclass
class Bike:
    description: str
    cost: int
    sale_price: int
    condition: float
    sold = False

    def update_sale_price(self, sale_price):
        if self.sold:
            print('Action not allowed, Bike has already been sold')
        else:
            self.sale_price = sale_price

    def sell(self):
        self.sold = True

    def __str__(self):
        return str(self.__dict__)


bike1 = Bike('Univega Alpina, orange', cost=100, sale_price=500, condition=0.5)
bike1.update_sale_price(350)
bike1.sell()
print(bike1)

根据Object Oriented Programming上的维基百科文章,[它]是一种基于“对象”概念的编程范式,它可以包含数据和代码:数据形式字段(通常称为属性或属性)和代码,以过程的形式(通常称为方法)。

从字面上看,这意味着您应该将影响自行车字典中任何值的任何函数转换为 Bike class 的方法。在 Python 中,这并不完全正确,但理解为什么是一个有点高级的主题,与您要问的核心问题并不是非常相关。

以下是如何将规定的原则应用到您的程序编程中并使其成为 object-oriented。请注意,我添加了一个特殊的 __repr__() 方法来控制 class 个实例如何“正式”将它们自己表示为字符串。

class Bike:
    def __init__(self, sale_price, description, cost, condition, sold=False):
        self.sale_price = sale_price
        self.description = description
        self.cost = cost
        self.condition = condition
        self.sold = sold

    def __repr__(self):
        classname = type(self).__name__
        attributes = ', '.join(f'{name}={value!r}' for name, value in vars(self).items())
        return f'{classname}({attributes})'

    def sell(self):
        self.sold = True

    def update_sell_price(self, sale_price):
        self.sale_price = sale_price


bike1 = Bike(description='Univega Alpina, orange', cost=100, sale_price=500, condition=0.5)
bike1.update_sell_price(sale_price=350)
bike1.sell()
print(bike1)