在撰寫本文時,我目前正在學習/使用 Python 3.10.2 中的類。我想要實作的是創建一個類實體,它是另一個類中的一個屬性。
這是我一直在撰寫的一些代碼,以幫助證明我的觀點。
class Vehicle():
"""To model a basic vehicle"""
def __init__(self, name, max_speed, millage):
"""Initiate class variables"""
self.name = name
self.max_speed = max_speed
self.millage = millage
self.tyre = Tyre()
def vehicle_details(self):
"""display vehicle details"""
return f"\nName: {self.name.title()}, Max speed: {self.max_speed}MPH, Millage: {self.millage} "
class Tyre():
"""A class specific for vehicle tyres"""
def __init__(self, size=16, pressure=36):
self.size = size
self.pressure = pressure
def tyre_details(self):
"""Print tyre details."""
print(f'Tyre size: {self.size} inches.')
print(f"Tyre pressure {self.pressure} PSI.")
在Vehicle課堂上,我添加Tyre()為屬性。
現在這段代碼可以作業,我可以Tyre通過我的實體呼叫這些方法,但只有當我在類中和類中Vehicle分配預先確定的值時。sizepressureTyre
是否有:
一種無需在
Tyre類中分配預定值就可以實作這一目標的方法?如果我不分配預先確定的值,這是我收到的 Traceback:
TypeError: __init__() missing 2 required positional arguments: 'size' and 'pressure'An easy way for me to overwrite the pre-determined values when calling this class and its methods if I am unable to remove the pre-determined values?
uj5u.com熱心網友回復:
- 一種無需在輪胎類中分配預定值就可以實作這一目標的方法?
一個可能的解決方案可能是Tyre在初始化時傳遞引數Vehicle:
class Vehicle:
def __init__(self, name, max_speed, millage, tyre_size=16, tyre_pressure=36):
"""Initiate class variables"""
self.name = name
self.max_speed = max_speed
self.millage = millage
self.tyre = Tyre(size=tyre_size, pressure=tyre_pressure)
- 如果我無法洗掉預定值,那么在呼叫此類及其方法時覆寫預定值的簡單方法是什么?
您可以簡單地不使用任何預先確定的值,要求明確提供它們:
class Tyre:
def __init__(self, size, pressure):
# ...
如果沒有傳遞任何值,則會引發例外。只有當你真的想要時,你才應該依賴預先確定的值。而不是總是依賴一組特定的預定值。
通常,我建議僅在您很少需要與默認值不同的值時才使用預先確定的值。例如,如果你有一個User類,你可能總是使用不同的username. 沒有明顯的默認值。另一方面,當你有一個Vehicle類時,在大多數情況下它會有 4 個門,但有時可能會有所不同(可能是 5 個),所以你可以默認 4 個并在需要時更改它。
uj5u.com熱心網友回復:
幾乎有無數種方法可以“解決”這個問題,但我將介紹一些。
沒有一個是“正確的”,都涉及權衡,隨著時間的推移,你會知道哪些是有意義的。
傳遞引數
class Vehicle():
"""To model a basic vehicle"""
def __init__(self, name, max_speed, millage, tyre_size, tyre_pressure):
"""Initiate class variables"""
self.name = name
self.max_speed = max_speed
self.millage = millage
self.tyre = Tyre(tyre_size, tyre_pressure)
def vehicle_details(self):
"""display vehicle details"""
return f"\nName: {self.name.title()}, Max speed: {self.max_speed}MPH, Millage: {self.millage} "
class Tyre():
"""A class specific for vehicle tyres"""
def __init__(self, size, pressure):
self.size = size
self.pressure = pressure
def tyre_details(self):
"""Print tyre details."""
print(f'Tyre size: {self.size} inches.')
print(f"Tyre pressure {self.pressure} PSI.")
v1 = Vehicle("VehicleName", 120, 50_000, 16, 36)
# Or, with named arguments
v2 = Vehicle(
name = "VehicleName",
max_speed = 120,
millage = 50_000,
tyre_size = 16,
typre_pressure = 36
)
在這里,您只是將Tyre建構式的引數從Vehicle建構式傳遞到您的Tyre. 如果你每次構建一個Vehicle你都會知道Tyre規格,這很好。如果沒有,您可能會想要一個替代方案。
Vehicle以Tyre實體為引數構造
class Vehicle():
"""To model a basic vehicle"""
def __init__(self, name, max_speed, millage, tyre):
"""Initiate class variables"""
self.name = name
self.max_speed = max_speed
self.millage = millage
self.tyre = tyre
def vehicle_details(self):
"""display vehicle details"""
return f"\nName: {self.name.title()}, Max speed: {self.max_speed}MPH, Millage: {self.millage} "
class Tyre():
"""A class specific for vehicle tyres"""
def __init__(self, size, pressure):
self.size = size
self.pressure = pressure
def tyre_details(self):
"""Print tyre details."""
print(f'Tyre size: {self.size} inches.')
print(f"Tyre pressure {self.pressure} PSI.")
v = Vehicle(
name = "VehicleName",
max_speed = 120,
millage = 50_000,
tyre = Tyre(16, 36)
)
與前一個選項類似,但在前一個選項中,每個選項都有Vehicle自己的Tyre實體。在這里您可以“共享”Tyre物件。在這種情況下可能不是什么大問題,但要記住一些事情,尤其是當您使用更大或更復雜的物件和/或共享成為一種好處時。
共享Tyre實體可能如下所示:
standard_tyre = Tyre(16, 36)
v1 = Vehicle(
name = "VehicleOne",
max_speed = 120,
millage = 50_000,
tyre = standard_tyre,
)
v2 = Vehicle(
name = "VehicleTwo",
max_speed = 140,
millage = 20_000,
tyre = standard_tyre,
)
稍后在建構式之外設定輪胎
class Vehicle():
"""To model a basic vehicle"""
def __init__(self, name, max_speed, millage):
"""Initiate class variables"""
self.name = name
self.max_speed = max_speed
self.millage = millage
self.tyre = None
def vehicle_details(self):
"""display vehicle details"""
return f"\nName: {self.name.title()}, Max speed: {self.max_speed}MPH, Millage: {self.millage} "
class Tyre():
"""A class specific for vehicle tyres"""
def __init__(self, size, pressure):
self.size = size
self.pressure = pressure
def tyre_details(self):
"""Print tyre details."""
print(f'Tyre size: {self.size} inches.')
print(f"Tyre pressure {self.pressure} PSI.")
v = Vehicle(
name = "VehicleName",
max_speed = 120,
millage = 50_000,
)
v.tyre = Tyre(16,36)
Tyre也許您在創建 時不知道 的細節是什么Vehicle,但您仍然想要一個Vehicle實體。
uj5u.com熱心網友回復:
您可以在創建Tyre類的實體時設定引數。預先確定的值僅在沒有傳入引數時使用,因此如果您這樣做self.tyre = Tyre(size goes here, pressure goes here),它將不會使用預先確定的值。
uj5u.com熱心網友回復:
- 我在您的代碼之后運行了以下內容,它對我來說效果很好。
veh = Vehicle('Volkswagen', 200, 10)
print(veh.tyre.tyre_details())
輸出:
Tyre size: 16 inches.
Tyre pressure 36 PSI.
- 通過車輛實體覆寫輪胎尺寸和壓力:
veh.tyre.size = 17
veh.tyre.pressure = 38
print(veh.tyre.tyre_details())
輸出
Tyre size: 17 inches.
Tyre pressure 38 PSI.
也許您錯誤地訪問了輪胎實體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/446023.html
標籤:python class oop attributes instance
下一篇:如何獲取類中變數的所有值?
