Why are Python's 'private' methods not actually private?

后端 未结 12 2114
不思量自难忘°
不思量自难忘° 2020-11-22 02:50

Python gives us the ability to create \'private\' methods and variables within a class by prepending double underscores to the name, like this: __myPrivateMethod()

相关标签:
12条回答
  • 2020-11-22 03:00

    It's not like you absolutly can't get around privateness of members in any language (pointer arithmetics in C++, Reflections in .NET/Java).

    The point is that you get an error if you try to call the private method by accident. But if you want to shoot yourself in the foot, go ahead and do it.

    Edit: You don't try to secure your stuff by OO-encapsulation, do you?

    0 讨论(0)
  • 2020-11-22 03:02

    With Python 3.4 this is the behaviour:

    >>> class Foo:
            def __init__(self):
                    pass
            def __privateMethod(self):
                    return 3
            def invoke(self):
                    return self.__privateMethod()
    
    
    >>> help(Foo)
    Help on class Foo in module __main__:
    
    class Foo(builtins.object)
     |  Methods defined here:
     |
     |  __init__(self)
     |
     |  invoke(self)
     |
     |  ----------------------------------------------------------------------
     |  Data descriptors defined here:
     |
     |  __dict__
     |      dictionary for instance variables (if defined)
     |
     |  __weakref__
     |      list of weak references to the object (if defined)
    
     >>> f = Foo()
     >>> f.invoke()
     3
     >>> f.__privateMethod()
     Traceback (most recent call last):
       File "<pyshell#47>", line 1, in <module>
         f.__privateMethod()
     AttributeError: 'Foo' object has no attribute '__privateMethod'
    

    https://docs.python.org/3/tutorial/classes.html#tut-private

    Note that the mangling rules are designed mostly to avoid accidents; it still is possible to access or modify a variable that is considered private. This can even be useful in special circumstances, such as in the debugger.

    Even if the question is old I hope my snippet could be helpful.

    0 讨论(0)
  • 2020-11-22 03:04

    Why are Python's 'private' methods not actually private?

    As I understand it, they can't be private. How could privacy be enforced?

    The obvious answer is "private members can only be accessed through self", but that wouldn't work - self is not special in Python, it is nothing more than a commonly-used name for the first parameter of a function.

    0 讨论(0)
  • 2020-11-22 03:16

    It's just one of those language design choices. On some level they are justified. They make it so you need to go pretty far out of your way to try and call the method, and if you really need it that badly, you must have a pretty good reason!

    Debugging hooks and testing come to mind as possible applications, used responsibly of course.

    0 讨论(0)
  • 2020-11-22 03:17

    The most important concern about private methods and attributes is to tell developers not to call it outside the class and this is encapsulation. one may misunderstand security from encapsulation. when one deliberately uses syntax like that(bellow) you mentioned, you do not want encapsulation.

    obj._MyClass__myPrivateMethod()
    

    I have migrated from C# and at first it was weird for me too but after a while I came to the idea that only the way that Python code designers think about OOP is different.

    0 讨论(0)
  • 2020-11-22 03:18

    Example of private function

    import re
    import inspect
    
    class MyClass :
    
        def __init__(self) :
            pass
    
        def private_function ( self ) :
            try :
                function_call = inspect.stack()[1][4][0].strip()
    
                # See if the function_call has "self." in the begining
                matched = re.match( '^self\.', function_call )
                if not matched :
                    print 'This is Private Function, Go Away'
                    return
            except :
                print 'This is Private Function, Go Away'
                return
    
            # This is the real Function, only accessible inside class #
            print 'Hey, Welcome in to function'
    
        def public_function ( self ) :
            # i can call private function from inside the class
            self.private_function()
    
    ### End ###
    
    0 讨论(0)
提交回复
热议问题