@staticmethod & @classmethod

一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法,而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。 为了编程的时候命名空间整洁有利于组织代码。

@staticmethod 把函数写进 class 体内,并使用@staticmethod 标记, 不需要传入代表自身对象的 self 参数和代表自身类的 cls 参数,可以理解为除了调用方式与类外的函数不一样外,使用方法与独立于类的函数一样, 不依赖类和对象。

@classmethod依赖于类本身,可以调用类的属性、方法, 可以实例化对象并进行操作,避免硬编码

示例代码:

class StaticMethodTest:  
    def __init__(self, name, sex):
        self.test = "test"
        self.name = name
        self.sex = sex

    def __str__(self):
        return '%s is a %s' % (self.name, self.sex)

    def __repr__(self):
        return 'StaticMethodTest(%s, %s)' % (self.name, self.sex)

    @staticmethod
    def static_method_print():
        print('I am printing!')

    @classmethod
    def class_method_print(cls):
        icls = cls("iqinfei", "iman")
        print(icls)
        print(icls.name)
        print(icls.test)
        cls.static_method_print()
        icls.static_method_print()

StaticMethodTest.static_method_print()  
StaticMethodTest.class_method_print()  
s = StaticMethodTest("qinfei", "haha")  
s.static_method_print()  
s.class_method_print()  

set()

python 集合数据类型, 没有重复的数据类型

a = set('haha')  
print(a)  
a.add('o')  
print(a)  
a.remove('o')  
print(a)  
b = set('abandon')  
print(b)  
print(a & b)  
print(a | b)  
print(a - b)  

exec() & eval()

提供了执行存储在字符串中的 python 代码的方法, 会影响当前代码命名空间

慎用, 危险!

exec() 会执行一系列 python 语句, 不返回任何结果

eval() 会计算 python 表达式并返回结果

技巧用法:

可以把list,tuple,dict和string相互转化。
#################################################
字符串转换成列表
>>>a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
>>>type(a)
<type 'str'>  
>>> b = eval(a)
>>> print b
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
>>> type(b)
<type 'list'>  
#################################################
字符串转换成字典
>>> a = "{1: 'a', 2: 'b'}"
>>> type(a)
<type 'str'>  
>>> b = eval(a)
>>> print b
{1: 'a', 2: 'b'}
>>> type(b)
<type 'dict'>  
#################################################
字符串转换成元组
>>> a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
>>> type(a)
<type 'str'>  
>>> b = eval(a)
>>> print b
([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))
>>> type(b)
<type 'tuple'>  

python 新式类与旧式类:

  • 首先,写法不一样:

Python 2.x中默认都是经典类,只有显式继承了object才是新式类

Python 3.x中默认都是新式类,不必显式的继承object

class A:
pass

class B(object):
pass

  • 在多继承中,新式类采用广度优先搜索,而旧式类是采用深度优先搜索。
  • 新式类更符合OOP编程思想,统一了python中的类型机制。

例:

class A():  
    def __init__(self):
        pass
    def save(self):
        print "This is from A"
class B(A):  
    def __init__(self):
        pass
class C(A):  
    def __init__(self):
        pass
    def save(self):
        print  "This is from C"
class D(B,C):  
    def __init__(self):
        pass
fun =  D()  
fun.save()

经典类的答案: This is from A
新式类的答案: This is from C

作者:刘康
链接:https://www.zhihu.com/question/22475395/answer/133787573
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

------新式类对象可以直接通过class属性获取自身类型:type

------继承搜索的顺序发生了改变,经典类多继承属性搜索顺序: 先深入继承树左侧,再返回,开始找右侧;新式类多继承属性搜索顺序: 先水平搜索,然后再向上移动

------新式类增加了slots内置属性, 可以把实例属性的种类锁定到slots规定的范围之中

------新式类增加了getattribute方法

作者:筱骁沙 链接:https://www.zhihu.com/question/22475395/answer/134514931 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。