Python 如何在uuu init_uuuu中验证类参数?

Python 如何在uuu init_uuuu中验证类参数?,python,Python,我一直在寻找这类问题,至今还没有找到一个类似的问题 我曾尝试使用for循环在火车的init中进行一些验证,尽管没有成功,但会忽略这些乘客 tl;dr-当我知道乘客名单中的一些乘客由于座位超出范围或车厢超出范围而无法进入列车时,我如何验证乘客名单中的乘客 """Train.""" class Train: def __init__(self, passengers: list, carriages: int, seats_in

我一直在寻找这类问题,至今还没有找到一个类似的问题

我曾尝试使用for循环在火车的init中进行一些验证,尽管没有成功,但会忽略这些乘客

tl;dr-当我知道乘客名单中的一些乘客由于座位超出范围或车厢超出范围而无法进入列车时,我如何验证乘客名单中的乘客

"""Train."""


class Train:
    def __init__(self, passengers: list, carriages: int, seats_in_carriage: int):
        

        #--Insert validation for passengers allowed on train--#        

        self._passengers = passengers
        self._carriages = carriages
        self._seats_in_carriage = seats_in_carriage

    @property
    def passengers(self) -> list:
        return self._passengers

    @property
    def carriages(self) -> int:
        return self._carriages

    @property
    def seats_in_carriage(self) -> int:
        return self._seats_in_carriage

    def get_seats_in_train(self) -> int:
        return self._seats_in_carriage * self._carriages

    def get_number_of_passengers(self) -> int:
        return len(self._passengers)

    def get_passengers_in_carriages(self) -> dict:
        return {}

    @passengers.setter
    def passengers(self, value_list: list):
        self._passengers = value_list

    @carriages.setter
    def carriages(self, value: int):
        self._carriages = value

    @seats_in_carriage.setter
    def seats_in_carriage(self, value: int):
        self._seats_in_carriage = value


class Passenger:
    def __init__(self, passenger_id: str, seat: str):
        self.carriage_number = seat.split("-")[0]
        self.seat_number = seat.split("-")[1]
        self._seat = seat
        self._passenger_id = passenger_id

    def __dict__(self):
        if str(2) >= self.seat_number > str(0) and self.carriage_number <= str(3):
            passenger_dct = {'id': str(self._passenger_id), 'seat': str(self._seat)}
            return passenger_dct


if __name__ == '__main__':
    passengers = [
        Passenger('test', '1-2'),   #--"test"= passenger_id, "x-y" : x= carriage_nr, y= seat_nr// valid
        Passenger('test2', '2-3'),  #-- invalid, seat_nr=3, train carriage has only 2 seats.
        Passenger('test3', '4-2'),  #-- invalid, carriage_nr = 4, train only has 3 carriages.
        Passenger('test4', '3-2'),  #-- valid
        Passenger('test5', '1-1'),  #-- valid
        Passenger('test6', '1-0'),  #-- invalid, no seat_nr 0 on train carriage
    ]
    assert passengers[0].__dict__() == {'id': 'test', 'seat': '1-2'}

    t = Train(passengers, 3, 2)  #--passengers list, number of carriages, number of seats in carriage.
    
    print(t.get_number_of_passengers()) # -- Should print 3, instead prints all 6.


“火车”
班次:
定义初始(自身、乘客:列表、车厢:int、车厢中的座位:int):
#--插入列车上允许乘客的验证--#
自身。_乘客=乘客
自行车厢=车厢
车厢内座位=车厢内座位
@财产
def乘客(自助)->列表:
返回自驾乘客
@财产
def机架(自)->int:
返回自己的车厢
@财产
def座椅在车厢内(自)->int:
返回自我。坐在车厢里
def获取列车中的座椅(自我)->int:
返回自驾马车中的自驾座位
def获取乘客数量(自我)->int:
回程舱(自乘)
def让乘客上车(自行)->说明:
返回{}
@乘客,塞特
def乘客(自身、价值列表:列表):
自身。_乘客=价值_列表
@马车
def机架(自身,值:int):
自车=价值
@车厢中的座椅。设置器
def座椅位于车厢内(自身,值:int):
self.\u seats\u in\u carries=值
头等舱乘客:
定义初始(自身、乘客id:str、座位:str):
自行车架号=座椅分离(“-”[0]
self.seat_number=座椅拆分(“-”[1]
self.\u seat=座位
自我识别。\乘客识别号=乘客识别号
定义(自我):

如果str(2)>=self.seat\u number>str(0)和self.carrier\u number我认为解决方案非常简单,我不确定为什么这不起作用:“我尝试使用for循环在火车的init中进行一些验证,尽管没有成功,但会忽略那些乘客。”基本上,您可以循环浏览乘客列表并过滤出无效乘客对象,例如:

self.\u乘客=列表(过滤器(lambda p:p.座位号有效,乘客))

这将使用lambda函数检查某些条件,以便将它们包括在最终列表中。另外,你的能手和二传手目前没有做任何事情,所以他们是毫无意义的。

我想用另一个问题来回答这个问题:没有火车的乘客有意义吗?如果不是,则
Passenger
可以是
Train
的嵌套类,并且可以添加到
Train
中,以添加、验证和返回
Passenger
实例。i、 e.
火车。添加乘客(乘客id=“乘客id”,座位=1,车厢=2)
。感谢您的评论,非常有趣的方法@你的总体观点是好的,但是为什么是嵌套类呢?它解决不了任何问题。@Crimson不在注释中发布代码。编辑您的问题以包含一个。请删除所有不必要的细节,只是掩盖了正在发生的事情。并尝试给出一个精确的问题陈述。在任何情况下,当你尝试代码时,什么都不起作用。请准确点。检查一下@AttilaViniczai,它根本不是一个pythonic构造。Python中代码组织的基本单元是模块。更传统的方法是有一个适当命名的模块,然后制作
class Train:…
和name
class\u Passenger:…
,这让每个人都知道
\u Passenger
是模型的一个实现细节,模块APIDo的非公共部分注意到,上述解决方案在实现层面上紧密结合了
Train
Passenger
类。换言之,对其中一个的更改可能会影响另一个。谢谢您的回答!我试着这样做,但是由于没有任何证据表明座位号是否有效,我试着将乘客级别的座位号和车厢号与列车级别的车厢号和座位数进行比较。但是我大部分都有属性错误:/。这应该不是很难实现的,属性错误可能意味着您在调用它们之前没有将这些属性添加到类中,但是如果没有更多信息,我将不知道@你是对的,我期待着你的回答