一个让代码可读性降低的函数(让自己看懂,让别人看得迷糊)

前言:

这就当娱乐看着玩

老是去看别人写的web页,防咱跟防贼似的!混淆呀,平坦化呀... 我就在想一个问题,要是有一天,别人拿了我的代码,然后我不想让他给我乱改,怎么办? 我也给他来个混淆...或者说点其他的,要是有一天我离职了,这公司我对他没啥感恩的....

正文:

多用Getattr函数!!!

只有你自己能懂的函数,其他人看了,由他慢慢去翻呗....

详解这个函数:

在Python中,`getattr`是一个内置函数,它用于动态地访问或获取对象的属性。这在你不确定一个对象是否拥有某个属性,或者你要在运行时动态地确定要访问的属性时,非常有用。

动态属性访问

在面向对象编程中,对象通常具有多种属性和方法。通常情况下,你会直接通过`.`访问它们,例如,`object.attribute`。但在某些情况下,你可能希望根据某些条件动态地访问不同的属性。这就是`getattr`发挥作用的地方。

 基本用法

getattr(object, 'attribute', default_value)


 

- `object`:你希望获取其属性的对象。
- `'attribute'`:一个字符串,表示你希望获取的属性名。
- `default_value`:(可选参数)如果指定属性不存在,`getattr`会返回这个值。如果未提供此参数,属性不存在时将抛出`AttributeError`。

示例

考虑以下类的示例:

 

class Car:
    def __init__(self, color, brand):
        self.color = color
        self.brand = brand

car = Car('Red', 'Toyota')

如果我们要获取`color`属性,通常我们会写`car.color`。但如果我们要动态地获取属性(例如,我们不知道事先我们想要的属性名是什么),我们可以使用`getattr`:

attribute_name = 'color'
color = getattr(car, attribute_name)
print(color)  # 输出: Red


 

如果`attribute_name`变量的值是基于程序运行时的某些条件得到的,`getattr`就可以让我们的代码更加灵活。

默认值

当所请求的属性不存在时,不使用`default_value`参数:

print(getattr(car, 'price'))  # 因为Car类中没有price属性,这将抛出AttributeError


 

使用`default_value`参数:


print(getattr(car, 'price', 10000))  # 输出: 10000,因为Car类中没有price属性


 

这在你不确定访问的属性是否存在,且不想程序因`AttributeError`而中断时很有用。

 何时使用

`getattr`是一个非常强大的工具,因为它为动态代码提供了很大的灵活性。以下是一些使用`getattr`的情景:

- 当你在编写需要从外部源(如用户输入)决定属性名称时。
- 在反射或元编程任务中,例如动态调用方法或情况,你事先可能不知道要执行的准确函数或方法。
- 当你使用配置文件来确定要使用的属性时。
- 在API或框架中,当你需要根据传入的参数动态获取对象状态时。

个人讲个例子:
class MysteryBox:
    def __init__(self, secret_key):
        self._hidden_key = secret_key

    def unlock(self, method):
        technique = getattr(self, method, None)
        if technique:
            return technique()
        return "什么也没有发生"

    def _method_a(self):
        return "解锁A成功"

    def _method_b(self):
        return "解锁B成功"

    def _show_secret(self):
        return self._hidden_key

# 创建实例
box = MysteryBox("一个深藏的秘密")

# 此函数映射看似无意义的字符串到类的私有方法
def mapper(phrase):
    switch = {'石头': '_method_a', '剪刀': '_method_b', '我要看秘密': '_show_secret'}
    return switch.get(phrase, '')

# 获取用户输入来模拟外部传入参数
user_input_1 = '石头' 
user_input_2 = '剪刀'
user_input_3 = '我要看秘密'

# 混淆了正常的调用过程
result = box.unlock(mapper(user_input_1)) 
print(result) # 输出 "解锁A成功"

result = box.unlock(mapper(user_input_2)) 
print(result) # 输出 "解锁B成功"

result = box.unlock(mapper(user_input_3))
print(result) # 输出 "一个深藏的秘密"
我故意使用不直观的变量名,并把一些操作和调用隐藏在看似无关的函数调用后面,使得代码难理解! (别人真的调用的时候,不得给他整疯了呀....哈哈哈)

结论

其实吧,getattr并不是真的用来做代码混淆的,但是,你带起来用能有特殊功效~ 当然,咱就是去破别人混淆的,咱自己也就是看别人混得烦了,自己也整个玩玩...这就当娱乐看着玩吧!

`getattr`能够为Python代码带来高度的灵活性和强大的动态功能,但同时也需要注意避免因过度动态而使代码难以理解和维护。合理地使用它,你的代码会变得更加强大,能够适应多变的需求。

你可能感兴趣的:(15天玩转高级python,python,开发语言)