了解Python属性和方法

时间:2013-12-10 17:23:51

标签: 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中内置的方法。将括号()包含在语句外部的逻辑是什么?再次,如果我手动运行它们,我会得到正确的值。

2 个答案:

答案 0 :(得分:0)

第二个陈述,围绕if陈述的表达的范围,只是不必要和坏的风格。

第一句话需要更详细的解释:

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

这将检查tcp_connect_scan_resp所属类型的字符串表示是否等于“”。这是一种糟糕的类型检查形式,使用方式很糟糕。在某些情况下可能需要进行类型检查,但通常您应该尝试在Python中避免使用它(请参阅duck typing)。如果必须,请使用isinstance()

在Python内置类型None的情况下,惯用的方法是写

if foo is None

现在,您自己使用type()获得“相同结果”的原因是,如果您在交互式Python shell中输入某些内容,则解释器代表您的值(通过致电__repr__())。除了具有文字符号的基本类型(如整数,字符串或序列)之外,对象的表示与其值(或者您为重新创建该对象而键入的内容)不一定相同。

所以,当你这样做时

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

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

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

另外,请考虑一下:

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

答案 1 :(得分:0)

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

您应该使用isinstance(obj, Class),或者您只需编写if obj is None