Python中如何通过单个x输入获取[x,x]形式的退化区间?
Got it, let's break down how to solve this problem so your Interval class can handle both single-argument degenerate intervals (like Interval(1) → [1,1]) and regular two-argument intervals, plus how to extend the __contains__ method for proper membership checks.
1. Adjust the Constructor (__init__) to Accept 1 or 2 Arguments
The simplest way is to modify your Interval class's constructor to handle a single argument by setting both bounds to that value. Here's a clean, robust implementation:
class Interval: def __init__(self, lower, upper=None): # Handle degenerate interval if only one argument is provided if upper is None: self.lower = self.upper = lower else: # Add validation to ensure valid interval bounds if lower > upper: raise ValueError(f"Lower bound {lower} cannot exceed upper bound {upper}") self.lower = lower self.upper = upper def __repr__(self): # Make intervals display in a readable format return f"[{self.lower}, {self.upper}]" # Test cases print(Interval(1)) # Output: [1, 1] print(Interval(2, 5)) # Output: [2, 5] # Interval(5, 2) # Raises ValueError: Lower bound 5 cannot exceed upper bound 2
This approach keeps the API intuitive—users can pass either one or two arguments, and the class handles the logic without needing subclasses (which you correctly noted wouldn't solve the parameter requirement issue).
2. Extend the __contains__ Method for Membership Checks
Absolutely, you can (and should!) extend the __contains__ method to work seamlessly with both degenerate and regular intervals. The method will check if a value falls within the interval bounds, which naturally handles degenerate cases (since x just needs to equal the single bound).
Add this method to your Interval class:
def __contains__(self, value): # For degenerate intervals [a,a], this checks if value == a # For regular intervals [a,b], this checks if a <= value <= b return self.lower <= value <= self.upper
Testing the __contains__ Method
deg_interval = Interval(3) print(3 in deg_interval) # Output: True print(4 in deg_interval) # Output: False reg_interval = Interval(2, 6) print(4 in reg_interval) # Output: True print(1 in reg_interval) # Output: False
Why Subclassing Didn't Work
You mentioned subclassing wasn't helpful because subclasses still required two parameters—that's correct, since subclasses inherit the parent's constructor unless you explicitly override it. If you had to use a subclass (e.g., for a third-party Interval class), you could override __init__ there to handle single arguments, but modifying the original class is cleaner if you own it.
内容的提问来源于stack exchange,提问作者user9750060

