2016-10-27 16 views
-1

假設我們有這樣的父類:如果孩子不同的參數(不同數量的參數)是否定的,檢入父類?

class Parent: 
    def __init__(self): 
     pass  

而這兩個孩子:

class Child1(Parent): 
    def __init__(self, 1stparam): 
     pass 

class Child2(Parent): 
    def __init__(self, 1stparam, 2ndparam): 
     pass 

我想爲Parent類的方法來檢查,如果傳遞的參數爲負。例如:

class Parent: 
    def __init__(self): 
     pass 

    def check_data(allparameters): 
     if allparameters <0: 
      return false 

我想爲所有兒童的以check_data通過繼承這種方法,例如:

mychild1 child1(-1) 
mychild2 child2(1, -1) 
[mychild1.check_data(), mychild2.check_data()] 

這應返回,當然,[False, False]

+1

爲什麼地獄我總是得到-1票? 1分鐘前我有+2 ... – D1X

+0

@ D1X一個對象不記得哪些參數傳遞給它的'__init__'方法,除非你將它們存儲在某個地方。 – Goyo

+0

@anonymous是的,但這不是解決方案。有人下調我的所有帖子? – D1X

回答

1

您需要功能*args。樣品例如:

def check_negative(*args): 
    for item in args: 
     if item < 0: 
      return False 
    else: 
     return True 

採樣運行:

>>> check_negative(1) 
True 
>>> check_negative(-1) 
False 
>>> check_negative(1, 1) 
True 
>>> check_negative(1, -1) 
False 
>>> check_negative(-1, -1) 
False 

欲瞭解更多詳情,請閱讀:What do *args and **kwargs mean?

+0

我想用這種方法繼承,但不起作用。我已經在OP中定義了函數,但是它似乎不會將傳遞給'child1'或'child2'的參數計數,因爲'len(args)'總是等於0. – D1X

+0

'* args *爲函數對通過的參數數量沒有限制。所以你必須明確地傳遞參數。如果您不想這樣做,則必須將該列表作爲對象變量存儲在該類中。在這種情況下,請使用[* Tryph's Answer *](http://stackoverflow.com/a/40284279/2063361) –

1

你可以做這樣的事情:

class Parent(object): 
    def __init__(self): 
     self.data = [] 

    def check_data(self): 
     return all(map(lambda arg: arg >= 0, self.data)) 


class Child1(Parent): 
    def __init__(self, param_1): 
     self.data = [param_1] 


class Child2(Parent): 
    def __init__(self, param_1, param_2): 
     self.data = [param_1, param_2] 


print(Child1(1).check_data()) # True 
print(Child1(-1).check_data()) # False 
print(Child2(1, 1).check_data()) # True 
print(Child2(1, -1).check_data()) # False 
print(Child2(-1, 1).check_data()) # False 
print(Child2(-1, -1).check_data()) # False 
  • map功能應用func對迭代器的每個元素賦予一個可迭代的結果。
  • 當提供負數時,lambda函數返回False。
  • 如果給定列表中的所有元素均爲True,則all函數將返回True。