2017-07-07 61 views
24

में मेरी कक्षा के उदाहरणों से एक संख्या को विभाजित करना मेरे पास Time नामक एक वर्ग है, और मुझे Frequency कक्षा लागू करने की आवश्यकता है। Frequency का उदाहरण प्राप्त करने के लिए Time के उदाहरण से मैं int एस या float एस को विभाजित कैसे कर सकता हूं?पायथन

मैं पहले से ही के बारे में __div__, __truediv__, __floordiv__ और अन्य अजगर विशेष तरीकों जानते हैं, और मैं पहले से ही नंबर या अन्य वर्गों के उदाहरणों द्वारा कक्षाओं के उदाहरणों को विभाजित करने के लिए अपने कोड में उन्हें इस्तेमाल, लेकिन मैं एक नंबर को विभाजित करने के लिए एक रास्ता नहीं मिल रहा है मेरी कक्षा के एक उदाहरण से।

क्या पाइथन में कक्षा के उदाहरण द्वारा किसी संख्या को विभाजित करना संभव है?

+2

हर प्रकार की मात्रा के लिए एक अलग वर्ग होने के कारण पागलपन के लिए सड़क की तरह लगता है ... आप इकाइयों के बीच विसंगतियों को कैसे प्रबंधित कर रहे हैं? – jpmc26

+0

मैं 'isinstance' का उपयोग करता हूं, और मुझे केवल समय और आवृत्ति लागू करना पड़ा। – Lucidiot

उत्तर

27

__rtruediv__ विधि वह है जिसे आप ढूंढ रहे हैं। जब x/y निष्पादित किया गया है, तो type(x)__div__(self, other) विधि लागू नहीं करता है जहां other कक्षा type(y) कक्षा का हो सकता है, तो type(y).__rtruediv__(y, x) निष्पादित किया गया है, और इसका परिणाम वापस कर दिया गया है।

उपयोग:

class Foo: 
    def __init__(self, x): 
     self.x = x 

    def __truediv__(self, other): 
     return self.x/other 

    def __rtruediv__(self, other): 
     return other/self.x 
>>> f = Foo(10)  
>>> f/10 
1.0 
>>> 10/f 
1.0
3

आपको __rtruediv__ और __rfloordiv__ लागू करने की आवश्यकता है।), पॉव, *, @, /, //,%, divmod() (, -

the documentation

object.__radd__(self, other) 
object.__rsub__(self, other) 
object.__rmul__(self, other) 
object.__rmatmul__(self, other) 
object.__rtruediv__(self, other) 
object.__rfloordiv__(self, other) 
object.__rmod__(self, other) 
object.__rdivmod__(self, other) 
object.__rpow__(self, other) 
object.__rlshift__(self, other) 
object.__rrshift__(self, other) 
object.__rand__(self, other) 
object.__rxor__(self, other) 
object.__ror__(self, other) 

इन विधियों से

द्विआधारी अंकगणितीय आपरेशनों (+, लागू करने के लिए कहा जाता है **, < <, >> &, ^, |) परिलक्षित (स्वैप) ऑपरेंड के साथ। इन कार्यों को केवल तभी बुलाया जाता है जब बाएं ऑपरेंड संबंधित ऑपरेशन [3] का समर्थन नहीं करता है और ऑपरेंड विभिन्न प्रकार के होते हैं। [4] उदाहरण के लिए, अभिव्यक्ति x-y का मूल्यांकन करने के लिए, जहां y एक वर्ग का उदाहरण है जिसमें __rsub__() विधि है, y.__rsub__(x) कहा जाता है कि x.__sub__(y) रिटर्न नहीं किया गया है।

9

हां। आपको बस यह सुनिश्चित करना होगा कि Time.__rtruediv__()Frequency उदाहरण देता है जब इसे फ़्लोट या पूर्णांक प्राप्त होता है।

उपयोग:

>>> 100/Time(2) 
Frequency(50.0) 
>>> 2.5/Time(5) 
Frequency(0.5) 

कार्यान्वयन:

class Time: 
    def __init__(self, value): 
    self.value = value 

    def __rtruediv__(self, other): 
    if not isinstance(other, (int, float)): 
     return NotImplemented 
    return Frequency(other/self.value) 

class Frequency: 
    def __init__(self, value): 
    self.value = value 

    def __repr__(self): 
    return '{}({})'.format(self.__class__.__name__, self.value) 

अजगर डॉक्स अपने कस्टम कक्षाओं के लिए implementing the arithmetic operations पर एक पूर्ण उदाहरण में शामिल है।

असंगत प्रकारों को संभालने का उचित तरीका विशेष मान NotImplemented वापस करना है।

NotImplemented

विशेष मूल्य जो बाइनरी विशेष तरीके से किया जाना चाहिये (जैसे __eq__(), __lt__(), __add__(), __rsub__(), आदि) संकेत मिलता है कि आपरेशन के संबंध में लागू नहीं है अन्य प्रकार

मान लीजिए कि आप एक असमर्थित जटिल संख्या का उपयोग करने का प्रयास करते हैं, NotImplemented लौटाएंगे एक सही त्रुटि संदेश के साथ TypeError का कारण बनता है। (कम से कम पायथन 3)

>>> 100j/Time(2) 

Traceback (most recent call last): 
    File "python", line 1, in <module> 
TypeError: unsupported operand type(s) for /: 'complex' and 'Time'