2017-04-17 44 views
0

我想这样做:如何单独的“测试(A = 10)”和“测试”在Python

a = TestClass1() <br> 
a.test.fun() #==> this i want to call TestClass2 method fun() <br> 
a.test(a=10).fun() #===> this i want to call TestClass3 method fun() <br> 

有谁知道如何分离呢?

我有三类:

class TestClass1: 
    aa = "" 
    def __init__(self): 
     self.aa = "ccc" 
    def __getattr__(self, item): 
     print("test 1 get attr = ",item) 
     return TestClass2() or TestClass3() #==> I don't how to seperate test and test(a =10) 
    def __getitem__(self, item): 
     print("__getitem__",item) 

class TestClass2: 
    def __call__(self, *args, **kwargs): 
     print("TestClass2 __call__ ") 
     return self 
    def fun(self): 
     print("this TestClass2 fun()") 

class TestClass3: 
    def __call__(self, *args, **kwargs): 
     print("TestClass3 33333 call 3 ") 
     return self 
    def fun(self): 
     print("this TestClass3 fun()") 
+0

也许是有意义的标识符将有助于更好地理解问题。就我所知,我无法找到将不相关的阶级伪装为另一个吸引人的想法。 – guidot

回答

0
给出 __getattr__两个例子

被调用,参数"test"。 你需要做这样的事情:

class TestClass1: 
    def __getattr__(self, item): 
     if item == 'test2': 
      return TestClass2() 
     elif item == 'test3': 
      return TestClass3() 

a = TestClass1() 
a.test2.fun() 
a.test3.fun() 

编辑:让我进一步解释。那么,在python中,函数和属性之间没有区别,python中的所有对象都是对象,所有对象都被视为相同,无论是整数还是函数。
当你做a.test它被降低到a.__getattr__('test')
而当你做a.test(a=10)它降低到a.__getattr__('test')(a=10)
a.__getattr__('test')返回的对象是相同的。
在第二种情况下,您正在获取属性test,然后使用参数a=10调用它。
EDIT2:什么你正在尝试做的可以实现这种方式:

class TestClass1: 
    test = TestClass2() 

class TestClass2: 
    def __call__(self, a): 
     if a == 10: 
      return TestClass3() 

    def fun(): 
     print("this TestClass2 fun()") 

a = TestClass1() 
a.test   # this is TestClass2 
a.test.fun  # this is TestClass2.fun 
a.test(a=10)  # this is TestClass3 
a.test(a=10).fun # this is TestClass3.fun 

EDIT3:更简单的方法将作出test功能:

class TestClass1: 
    def test(a=None): 
     if a is None: 
      return TestClass2() 
     if a == 10: 
      return TestClass3() 

a = TestClass1() 
a.test().fun  # TestClass2.fun 
a.test(a=10).fun # TestClass3.fun 
+0

感谢您的回应,这是可以的,但是当名称相同时,我不知道如何分隔属性'test'和函数调用'test(a = 10)' – Fent

+0

我添加了一点点说明。让我知道是否需要进一步解释。 –

+0

我添加了一个你想要实现的例子。 –