Python教程-Python中的名称混淆
在本教程中,我们将讨论Python中的名称混淆过程以及如何在Python中使用不同的方法进行名称混淆过程。
名称混淆
名称混淆是一种过程,其中具有一个下划线后缀和两个前导下划线的任何给定标识符都在文本上替换为__ClassName__Identifier。在__ClassName__Identifier名称中,ClassName是当前类中标识符所在的类的名称。
示例:
基本上,上述名称混淆的定义意味着以__Jtp形式(至少有两个前导下划线或至多一个下划线在名称后缀)的任何标识符将被替换为__ClassName__Jtp(当前类的名称将替换ClassName),并且ClassName中的前导下划线(s)会被删除。
请看下面的示例以理解名称混淆过程。
示例:
# A testing class for identifier
class Testing:
# Giving Name as an identifier
def __init__(self, name):
# Identifier initializing
self.__name = name
def PrintName(self):
print(self.__name)
t1 = Testing("javatiku") # Calling variable name with the class
t1.PrintName() # Printing name in the output
输出:
javatiku
解释:
在上面的程序中,我们定义了一个测试类,其中包含类中的名称标识符。在测试类中,我们定义了两个默认函数和一个带有PrintName()的函数。
在PrintName()函数中,我们使用打印命令来打印名称。然后,我们使用测试类初始化了一个t1变量。最后,我们使用PrintName()来打印我们在初始化Testing类时使用的名称。
注意:如果我们尝试在类外部访问Testing类的函数和变量,将会引发错误。只能在类内部进行对Testing Class中给定的变量所做的更改。
示例:2
# A testing class for identifier
class Testing:
# Giving Name as an identifier
def __init__(self, name):
# Identifier initializing with double underscore
self.__name = name
def PrintName(self):
print(self.__name)
t1 = Testing("javatiku") # Calling variable name with the class
t1.PrintName() # Printing name in the output
# Accessing identifier outside the class
print(t1.__name) # will throw an error in the output
输出:
javatiku
Traceback (most recent call last):
File "C:\Users\Manish\Downloads\code.py", line 12, in
print(t1.__name) # will throw an error in the output
AttributeError: 'Testing' object has no attribute '__name'
Python中的名称混淆
Python中的名称混淆过程的实现与上面讨论的内容相同。我们将使用不同的方法在Python程序中执行名称混淆过程并访问其中的变量。
在本节中,我们将执行以下任务:
- 使用dir()方法进行Python中的名称混淆
- 在程序中访问名称混淆的变量
- 在Python中使用方法覆盖进行名称混淆
我们将为每种方法使用一个程序来了解其在Python中的实现。
1. 使用dir()方法进行Python中的名称混淆
我们可以使用dir()方法执行Python中的名称混淆过程,Python解释器将对代码中提供的类执行名称混淆过程。我们可以通过将定义的类对象传递给dir()方法来使用dir()方法,dir()方法将返回属于给定类对象的所有有效属性。
请看下面的示例程序,以了解dir()方法的名称混淆:
示例:
# A testing class for name mangling
class Testing:
def __init__(self, name):
self.__name = name
# Initializing variable with the testing class
t1 = Testing("javatiku")
# Using dir() method on initialized variable
print(dir(t1))
输出:
['_Testing__name', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
解释:
从输出中可以看出,我们在初始化的变量上使用了dir()方法,即t1,在该方法中返回了类Testing的所有有效属性。我们还可以看到标识符的名称,即__name,由解释器更改为_Testing__name。
2. 访问名称混淆的变量
我们可以在类外部访问名称混淆的变量并在输出中打印它们(不像访问会返回错误的类变量)。要在类外部访问名称混淆的变量,我们只需将_ ClassName与变量一起添加,还可以在输出中打印变量的值。
请查看下面的程序,我们在测试类之外访问了名称混淆的变量。
示例:
# A testing class for name mangling
class Testing:
def __init__(self, name):
self.__name = name
# Initializing variable with the testing class
t1 = Testing("javatiku")
# Accessing Name mangled variables outside testing class
print("The name mangled that we are accessing outside the class: ", t1._Testing__name)
输出:
The name mangled that we are accessing outside the class: javatiku
解释:
我们能够在外部访问__name变量,因为它是一个名称混淆的变量,并在输出中返回了名称值。
3. 使用方法覆盖进行名称混淆
由于我们在程序中使用名称混淆过程,所以受限于私有类成员的有效用例的支持有限。对于私有类成员的有效用例的有限支持是为了避免名称与子类中定义的名称发生冲突。只要名称混淆过程按照Python类的定义进行,解释器就会执行名称混淆过程。这对于程序中的子类来说非常有帮助,因为它们可以覆盖方法而不会中断类之间方法的调用。
让我们了解以下示例。
示例:
# A default testing class for name mangling
class Testing:
def __init__(self):
self.__jtp() # name mangling with the Jtp variable
def jtp(self): # default function for name mangling in parent class
print("Name mangling process done inside the parent testing class")
# copy of jtp() method for private class members
__jtp = jtp # Name mangling with method overriding process
# A subclass for Testing class
class SubTesting(Testing):
# Providing new signature for jtp() function
def jtp(self):
print("Name mangling process done inside the child sub-testing class")
# Calling the objects from subclass and function of it
obj = SubTesting()
obj.jtp()
输出:
Name mangling process done inside the parent testing class
Name mangling process done inside the child sub-testing class
结论
首先,我们在本教程中学习了名称混淆过程的介绍。我们还学习了如何在Python中使用dir()方法进行名称混淆。然后,我们访问了类外部的名称混淆的变量。最后,我们还了解了如何在程序的给定子类中使用方法覆盖进行名称混淆的过程。