了解Python属性和方法

2024-04-29 07:32:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试学习Python,对正在使用的脚本有点困惑。我用Python来启动scapy。有一些条件语句可以测试某些值。我的困惑集中在如何检查值上。我希望我恰当地使用了术语属性和方法。我仍在试图找出内置功能与什么是包括在scapy。过去几年我一直在使用Powershell,所以很难进行切换:)

tcp_connect_scan_resp = sr1(IP(dst=dst_ip)/TCP(sport=src_port,dport=dst_port,flags="S"),timeout=10)
if(str(type(tcp_connect_scan_resp))=="<type 'NoneType'>"):
    Print "Closed"
elif(tcp_connect_scan_resp.haslayer(TCP)):
    if(tcp_connect_scan_resp.getlayer(TCP).flags == 0x12):

第一个条件语句似乎是检查属性“type”。在这种情况下,他们为什么要使用Python内置的str()type()函数?如果我只使用type(),它会得到相同的值。你知道吗

对于第二个和第三个条件语句,似乎使用了scapy中内置的方法。在语句外部包含括号()的逻辑是什么?同样,如果我手动运行它们,我会得到正确的值。你知道吗


Tags: 方法scan属性porttypeconnect语句条件
2条回答

第二个语句,围绕if语句表达式的偏执,是完全不必要的和糟糕的风格。你知道吗

第一种说法需要更详细的解释:

if(str(type(tcp_connect_scan_resp))=="<type 'NoneType'>"):

这将检查tcp_connect_scan_resp所属类型的字符串表示形式是否等于“”。这是一种不好的类型检查形式,使用方式不好。有些情况下可能需要进行类型检查,但通常在Python中应该尽量避免这种情况(请参见duck typing)。如果必须,请使用^{}。你知道吗

对于Python内置类型None,惯用的方法是只写

if foo is None

现在,您自己使用type()得到“相同结果”的原因是,如果您在交互式Python shell中输入一些内容,那么解释器为您表示值(通过调用^{})。除了具有文字符号(如整数、字符串或序列)的基本类型外,对象的表示形式不一定与其值相同(或者键入什么来重新创建相同的对象)。你知道吗

所以,当你这么做的时候

>>> foo = type(42)
>>> foo
<type 'int'>

解释器打印'<type 'int'>',但调用的结果实际上是int,即整数的内置类型:

>>> type(42) == int
True
>>> type(42) == "<type 'int'>"
False

另外,考虑一下:

为帮助特定专业领域而编写的库或工具通常由这些领域的专家编写,而不一定是Python专家。在我看来,你经常在科学图书馆看到这一点(例如^{}^{})。这并不意味着它们是糟糕的库,但它们通常不是Pythonic风格的好灵感。你知道吗

不要通过比较str(type(obj)) == 'ClassName'来检查类型。你知道吗

你应该使用isinstance(obj, Class),如果没有,你就写if obj is None。你知道吗

相关问题 更多 >