python 类方法,静态方法,普通方法比较2019-03-22

Python010

python 类方法,静态方法,普通方法比较2019-03-22,第1张

1.类方法用@classmethod:

        用途:一般用来对类属性进行限制性操作

        用法:该方法的调用者(不管是类调用还是实例调用),会默认把该类作为第一个参数传进来(调用者不必显示指定),这样该方法内部可以获取到该类,从而对类属性进行操作。实际用途可以用来限制对类属性的访问,不管是类调用还是实例调用,能保证修改的都是类属性。

2.静态方法用@staticmethod:

        用途:用来实现工具性方法

        用法:如果方法内部没有涉及到对实例属性的操作,可以把该方法定义为静态方法,不管是类调用还是实例调用,都能直接调用该方法实现相应功能。

3.普通方法:

        用途:实例调用的方法

        用法:方法内部涉及到对实例属性的操作,实例调用该方法时会自动默认将实例的引用作为第一个参数传进去。也可以用类直接访问,不过这样访问时需要手动传入第一个参数,也就是一个实例的引用。

附加: @property的使用(从语义规范上来说,只用于普通方法,也就是对实例变量进行控制,但也可以强行用来对类变量进行控制)

对私有变量的控制访问可以借鉴java的get、set方式。这没有任何问题。唯一的问题就是不直观,把对变量的访问变成了对方法的访问。而@property的作用就是还原这种直观的访问方式,可以像访问变量一样访问@property修饰的方法。注意:如果不想让别人修改某变量,可以用不写@XXX.setter方法来实现。

总结:不管方法是哪一种方法(类方法,静态方法,还是普通的实例方法),都可以用类直接访问和用实例进行访问,只是参数多传一个多传一个的问题。更重要的是语义的规范,语法上没什么问题。

__xxxitem__:使用 [''] 的方式操作属性时被调用

__setitem__:每当属性被赋值的时候都会调用该方法,因此不能再该方法内赋值 self.name = value 会死循环

__getitem__:当访问不存在的属性时会调用该方法

__delitem__:当删除属性时调用该方法

一些常用的方法

1. 逆转字符串的三种方法

1.1. 模拟C++中方法, 定义一个空字符串来实现

通过设置一个空字符串, 然后讲参数中的字符串从后往前遍历, 使用字符串的加法合并为新的字符串

复制代码 代码如下:

def reverse(text) :

str = ''

index = len(text) - 1

while index >= 0 :

str += text[index]

index -= 1

return str

1.2. 使用切片法

这个是Python中的一个特性, 切片可以取负值,这是采用切片的方法,设置步长为-1,这样就实现了反过来排序。

复制代码 代码如下:

def reverse_1(text) :

return text[::-1]

1.3. 使用列表

采用列表的reverse方法,先将text转换为列表,然后通过reverse方法反转,然后在通过join连接为字符串。

复制代码 代码如下:

def reverse_2(text) :

temp = list(text)

temp.reverse()

return ''.join(temp)

2. 使用reduce

使用匿名函数和reduce()

复制代码 代码如下:

def reverse_3(text) :

return reduce(lambda x, y : y + x, text)

print reverse_3("Hello")

3. 遍历字典的四种方法

复制代码 代码如下:

dict={"a":"apple","b":"banana","o":"orange"}

print "##########dict######################"

for i in dict:

print "dict[%s]=" % i,dict[i]

print "###########items#####################"

for (k,v) in dict.items():

print "dict[%s]=" % k,v

print "###########iteritems#################"

for k,v in dict.iteritems():

print "dict[%s]=" % k,v

print "###########iterkeys,itervalues#######"

for k,v in zip(dict.iterkeys(),dict.itervalues()):

print "dict[%s]=" % k,v

4. 遍历list的三种方法

复制代码 代码如下:

for key in lst :

print key

for i in range(len(lst)) :

print lst[i]

for index, key in enumerate(lst) :

print key//index是list的索引

5. 字典排序的方法

字典按照value的值从大到小的顺序来排序(默认从小到排序)。

复制代码 代码如下:

dic = {'a':31, 'bc':5, 'c':3, 'asd':4, 'aa':74, 'd':0}

dict= sorted(dic.iteritems(), key=lambda d:d[1], reverse = True)

print dict

//输出的结果:

[('aa', 74), ('a', 31), ('bc', 5), ('asd', 4), ('c', 3), ('d', 0)]

下面我们分解下代码

print dic.iteritems() 得到[(键,值)]的列表。

然后用sorted方法,通过key这个参数,指定排序是按照value,也就是第一个元素d[1的值来排序。reverse = True表示是需要翻转的,默认是从小到大,翻转的话,那就是从大到小。

对字典按键(key)排序:

复制代码 代码如下:

dic = {'a':31, 'bc':5, 'c':3, 'asd':4, 'aa':74, 'd':0}

dict= sorted(dic.iteritems(), key=lambda d:d[0]) # d[0]表示字典的键

print dict

#sorted中第三个可选参数为reverse, True表示从大到小排序

#默认reverse = False

6. 子类和父类

子类构造函数调用父类的初始化构造函数

复制代码 代码如下:

class A(object) :

def __init__(self) :

print "testA

class B(A) :

def __init__(self) :

A.__init__(self)

子类调用父类的同名函数

复制代码 代码如下:

super().fuleifunction()

7. 更灵活的参数传递方式

复制代码 代码如下:

func2(a=1, b=2, c=3) #默认参数

func3(*args) #接受任意数量的参数, 以tuple的方式传入

func4(**kargs) #把参数以键值对字典的形式传入

在变量前加上星号前缀(*),调用时的参数会存储在一个 tuple()对象中,赋值给形参。在函数内部,需要对参数进行处理时,只要对这个

tuple 类型的形参(这里是 args)进行操作就可以了。因此,函数在定义时并不需要指明参数个数,就可以处理任意参数个数的情况。

复制代码 代码如下:

def calcSum(*args):

sum = 0

for i in args:

sum += i

print sum

#调用:

calcSum(1,2,3)

calcSum(123,456)

calcSum()

#输出:

6

579

0

#################################

def printAll(**kargs):

for k in kargs:

print k, ':', kargs[k]

printAll(a=1, b=2, c=3)

printAll(x=4, y=5)

#输出:

a : 1

c : 3

b : 2

y : 5

x : 4

python的中参数可以多种形式进行组合, 在混合使用时,首先要注意函数的写法,必须遵守:

1.带有默认值的形参(arg=)须在无默认值的形参(arg)之后

2.元组参数(*args)须在带有默认值的形参(arg=)之后

3.字典参数(**kargs)须在元组参数(*args)之后

在函数被调用时,参数的传递过程为:

1.按顺序把无指定参数的实参赋值给形参

2.把指定参数名称(arg=v)的实参赋值给对应的形参

3.将多余的无指定参数的实参打包成一个 tuple 传递给元组参数(*args)

4.将多余的指定参数名的实参打包成一个 dict 传递给字典参数(**kargs)

8. lambda 表达式

lambda 表达式可以看做一种匿名函数

lambda 表达式的语法格式:

lambda 参数列表: 表达式 #参数列表周围没有括号,返回值前没有 return 关键字,也没有函数名称

复制代码 代码如下:

def fn(x):

return lambda y: x + y

#调用

a = fn(2)

print a(3)

#输出

5

分析

: fn(2)调用后, 相当于a = lambda y: 2 + y, 然后a(3)被调用时.

相当于 print lambda y: 2 + 3