在本教程中,我們將討論 Python 中的名稱混淆過程,以及如何使用不同的方法在 Python 中使用名稱混淆過程。
名稱混淆
用 類名 標識符替換帶有一個尾隨下劃線和兩個前導下劃線的任何給定標識符的過程稱為名稱混淆。在 類名 標識符名稱中,類名是存在標識符的當前類的名稱。
插圖:
基本上,上面給定的名稱混淆定義意味着任何形式的標識符,如 Jtp(名稱後面至少有兩個前導下劃線或最多有一個下劃線)將被 類名 Jtp(當前類的名稱將替換類名)替換,前導下劃線在類名中分條。
看下面的例子來理解名稱混淆過程。
示例:
# 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("JavaTpoint") # Calling variable name with the class
t1.PrintName() # Printing name in the output
輸出:
JavaTpoint
說明:
在上面的程序中,我們已經在類中定義了一個帶有名稱標識符的測試類。在測試類中,我們定義了兩個默認函數,一個是 PrintName()。
在 PrintName() 函數中,我們給出了打印名稱的打印命令。然後,我們用測試類初始化了一個 t1 變量。最後,我們使用了打印名稱()來打印我們在初始化測試類時使用的名稱。
注意:如果我們試圖在類外訪問 Testing 類的函數和變量,它會拋出一個錯誤。對測試類中給定的變量所做的任何更改只能在類中完成。
例: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("JavaTpoint") # 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
輸出:
JavaTpoint
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 中的名稱 Mangling
Python 中名稱混淆過程的實現與我們上面討論的相同。我們將在 Python 程序中使用不同的方法來實現名稱混淆過程和訪問其中的變量。
我們將在本部分執行以下任務:
- Python 中用 dir()方法命名託管
- 訪問程序中名稱損壞的變量
- Python 中使用方法重寫的名稱混淆
我們將為每個方法使用一個程序來理解它在 Python 中的實現。
1.用 dir()方法命名 mangling
我們可以使用 dir()方法來執行名稱混淆過程,它將對代碼中給定的類執行。Python 解釋器將對類進行名稱解析。我們可以通過在其中傳遞定義的類對象來使用 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("JavaTpoint")
# 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,返回了類測試的所有有效屬性並打印了它們。我們還可以看到,標識符的名稱,即 __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("JavaTpoint")
# 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: JavaTpoint
說明:
我們已經能夠在外部訪問 __name 變量,因為它是一個名稱損壞的變量,並且它在輸出中返回了名稱值。
3.使用方法重寫進行名稱混淆
當我們在程序中使用名稱 mangling process 時,我們受到了限制,因為對來自私有類的成員的有效用例的支持很少。對私有類成員的有效用例的有限支持是為了避免不同名稱與子類內部定義的名稱的衝突。只要名稱篡改過程按照 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() 方法來命名 mangling。然後,我們在它們所在的類之外訪問了名稱被破壞的變量。最後,我們還了解了如何在程序中給定的子類中使用方法重寫的名稱 mangling process。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/238892.html