存取 Python 私有函數與屬性 - tsungjung411/python-study GitHub Wiki

class A:
    __avg = None
    
    def __sum(self, a, b, c):
        print("a: ", a)
        print("b: ", b)
        print("c: ", c)
        sum = a + b + c
        print("sum(a, b, c)=", sum)
        self.__avg = sum / 3.0
        return sum
    # end-of-def
# end-of-class
    
a = A()
print("dir(A.__class__):\n", dir(A.__class__), '\n')

print('--------------------------------------------')

method_name = '_{}__sum'.format(a.__class__.__name__)
print('method_name: ', method_name)

method_pointer = a.__getattribute__(method_name)
print('method_pointer: ', method_pointer)

total = method_pointer
print("total(1,2,3)= {}".format(total(1,2,3)))

print('--------------------------------------------')

field_name = '_{}__avg'.format(type(a).__name__)
print('field_name: ', field_name)

field_pointer = a.__getattribute__(field_name)
print('field_pointer: ', field_pointer)

print("avg(1,2,3)= {}".format(field_pointer))

執行結果:

dir(A.__class__):
 ['__abstractmethods__', '__base__', '__bases__', '__basicsize__', 
'__call__', '__class__', '__delattr__', '__dict__', '__dictoffset__', 
'__dir__', '__doc__', '__eq__', '__flags__', '__format__', '__ge__', 
'__getattribute__', '__gt__', '__hash__', '__init__', 
'__instancecheck__', '__itemsize__', '__le__', '__lt__', '__module__', 
'__mro__', '__name__', '__ne__', '__new__', '__prepare__', 
'__qualname__', '__reduce__', '__reduce_ex__', '__repr__', 
'__setattr__', '__sizeof__', '__str__', '__subclasscheck__', 
'__subclasses__', '__subclasshook__', '__text_signature__', 
'__weakrefoffset__', 'mro'] 

--------------------------------------------
method_name:  _A__sum
method_pointer:  >
a:  1
b:  2
c:  3
sum(a, b, c)= 6
total(1,2,3)= 6
--------------------------------------------
field_name:  _A__avg
field_pointer:  2.0
avg(1,2,3)= 2.0

特別說明:

  • 若使用 dir(a.__class__) 印出所有屬性,不會有 __name__,要用 dir(A.__class__) 才會有。
⚠️ **GitHub.com Fallback** ⚠️