2016-07-30 50 views
1

有沒有辦法測試一個服裝類是否明確定義了一個屬性如__gt__?爲了把東西放在上下文中考慮這兩個類:如何測試一個類是否明確定義了__gt__?

class myclass1: 
    def __init__(self, val): 
     self.val = val 

    def __gt__(self, other): 
     if type(other) is int: 
      return self.val > other 
     else: 
      return self.val > other.val 


class myclass2: 
    def __init__(self, val): 
     self.val = val 

既然我定義的屬性不平等僅myclass1而不是myclass2調用

x1 = myclass1(5); x2 = myclass2(2) 
x1 > x2 
x2 < x1 

會在兩種情況下使用myclass1.__gt__。如果我定義了myclass2.__lt__,最後一行會調用它。但我沒有。因此x1__gt__在這兩個調用中都佔有優勢。我想我明白這一點(但歡迎評論)。

所以我的問題:有沒有辦法知道哪些不平等已明確定義爲自定義類?因爲

hasattr(x2, '__gt__') 

無論如何返回True

+0

您可以使用目錄(類名),其中將爲您提供屬於您的班級的所有方法和屬性。 –

+1

@ PiyushS.Wanare - 不管這是否明確定義了'__lt__'。 – Aguy

+1

@ PiyushS.Wanare看看'dir()'的工作方式:http://stackoverflow.com/q/33087797/846892 –

回答

2

您可以__dict__每一類裏面檢查:

'__gt__' in x2.__class__.__dict__ 
Out[23]: False 

'__gt__' in x1.__class__.__dict__ 
Out[24]: True 

或者,使用內置插件,以不依賴於dunders:

'__gt__' in vars(type(x1)) 
Out[31]: True 

'__gt__' in vars(type(x2)) 
Out[32]: False 
+0

請注意,這將無法檢測到類從一個超類繼承'__gt__'的情況(而不是自己定義它)。根據這個問題,這是否被視爲「明確」還不清楚。 – BrenBarn

+1

如果'__gt__'沒有在類中定義,但是它是從父類繼承的呢?我會推薦比較:'type(x2).__ gt__'和'object .__ gt__' –

+0

@AshwiniChaudhary - 太好了。似乎是一種有效的方式。 – Aguy

相關問題