我在想,四篇文章都没把这本书的前两章写完,是我写的太啰嗦了吗?这个进度是不是要快一点呢?还是就这样写吧!写下来主要是为了以后的自己看,还是得按照我这啰哩啰嗦的规矩来,哈哈。
Python的实用函数
这些函数在前几篇文章中都用过了,比如说帮助函数help(obj),把对象转为整数的int(obj),还有返回对象长度或元素个数的len(obj),还有打开文件用的open(fname,mode)函数,以及等待用户输入的raw_input(str)函数,其中str是用来展示的。还有三个是没有用过的函数,str(obj)这个是用来对象转字符串的,有时会把地址把对象的地址展示出来,这个和C#很像,还有就是type(obj)这个函数和C#的typeof()函数有一拼,另外还有一个就是dir([obj])这个函数返回的是对象的属性,这个函数好马婵呐!感觉应该不会常用吧,估计用不到吧!其实我不太明白它是干啥的!
被自己打脸是什么感觉
在上一段中我说dir([obj])函数没啥用,应该不常用,这个真是太打脸了。这个函数的用处和help()函数结合着用实在是太强大了,尤其是对新手来说更是如此。
如果不知道某个函数有哪些方法或者变量,就dir一下就知道这个函数的所有东西了,如果想知道这个函数的某个方法的作用的和用法,就help一下,就欧啦!突然感觉脸好疼啊!
Python好玩的语句和语法
- 注释用符号#,这个前面几篇文章已经用过了,不再赘述,突然想到上一篇文章中有一个问题没有解决,这个问题就是Python为啥是特意强调静态成员变量呢?它有没有动态成员变量呢?这个问题一会再说。
- 换行用符号\n,一般都是用这个符号进行换行,没啥说的。
- 继续上一行\,这个就有点意思了,继续上一行的意思就是,代码写的太长了,一行放不下,需要用两行来写,这个时候就要用到\来连接了。
- 两个语句显示在一行中用符号;,这个没啥说,因为C#就是这个样子。
- 冒号:需要说一下,C#里是{},而Python里是冒号进行分割代码的头和体。
- 代码缩进风格,这个Python对这一点是很严格的,也正因为如此,才使代码看着不乱,可以给人以美感。
- 模块化,这个和C#差不多吧!
Python为何特意强调静态成员变量?
刚搜了一下,我有点消化不动了,因为我又看到了类静态方法,类方法,类实例方法,这三种方法先不说,先说为啥强调静态成员变量,对于这个问题,看一下代码就知道了。
class Person(object):
children = []
def setPersonChildren(self,childrenName):
self.children.append(childrenName)
def printPersonChildren(self):
print self.children
person1=Person()
person2=Person()
person3=Person()
person1.setPersonChildren('zhangSan')
person1.printPersonChildren()
person2.printPersonChildren()
person3.printPersonChildren()
输出结果如下:
['zhangSan']
['zhangSan']
['zhangSan']
这样的输出结果是不是很不合理?zhangsan明明是给person1了啊!为啥person2,person3也有zhangsan呢?这让zhangsan情何以堪?但这说明了一个问题就是children这个成员变量被当作静态变量使用了,这也是为什么Python强调静态变量的原因了吧!但问题是,Python有没有动态的成员变量呢?有,必须有!
在说动态成员变量之前,需要再把上面的代码中添加一句话。
person1.setPersonChildren('zhangSan')
就只是添加了下面这句话
person1.setPersonChildren('lisi')
person1.printPersonChildren()
person2.printPersonChildren()
person3.printPersonChildren()
输出结果如下:
['zhangSan', 'lisi']
['zhangSan', 'lisi']
['zhangSan', 'lisi']
看,这个是赤裸裸的静态成员变量的用法对不对?现在应该很清楚的就明白了,它为什么是静态吧!下面说说怎么才能使其成为动态成员变量,还是看代码!
class Person(object):
def __init__(self):
self.children=[]
def setPersonChildren(self,childrenName):
self.children.append(childrenName)
def printPersonChildren(self):
print self.children
person1=Person()
person2=Person()
person3=Person()
person1.setPersonChildren('zhangSan')
person2.setPersonChildren('lisi')
person1.printPersonChildren()
person2.printPersonChildren()
person3.printPersonChildren()
这样就好了,输出结果如下:
['zhangSan']
['lisi']
[]
把成员变量放到init函数的self身上就变成动态成员变量了,是不是好简单呢?但是这对我来说确实是有点不适应啊!这个坑咱们是填完了,但填完一个坑,又来三个坑!下面看看这三个坑吧!
Python的类静态方法,类方法,类实例方法
- 类静态方法
这个方法和类没啥关系,无法访问类的任何属性(类属性,类实例属性),没有默认的第一个参数,就相当于是普普通通的一个方法,只是它需要@staticmethod
来标记其为类静态方法,这个也就只是个标记,没别的意思。 - 类方法
第一个参数必须是类对象,可以通过这个类对象访问类属性,但是无法访问类实例对象,是不是有点绕口还不好记?其实啊,这个就相当于是说,可以访问类的静态成员,但是由于没有传实例对象,所以不能访问类的实例属性。需要说明的是,这个类方法需要用@classmethod
标记。 - 类实例方法
第一个参数是类实例对象,是self,可以通过这个类实例对象访问类实例属性,可以通过类实例对象的__clsss__访问类属性。
可以通过类对象调用类方法,类实例方法,但是不可以调用类的实例方法,不过只有类实例对象可以调用这三个方法。三种方法的代码示例
class Person(object):
children='zhangSan'
def __init__(self,inst_name):
self.name=inst_name
def objMethod(self):
print 'My name is',self.name
@classmethod
def classMethod(cls):
print cls.children
@staticmethod
def staticMethod():
print 'I am is StaticMethod'
Person.staticMethod()
Person.classMethod()
print '-----------------------------'
person=Person('wangWu')
person.staticMethod()
person.classMethod()
person.objMethod()
这个代码应该是比较清楚的吧!下面来看看代码的执行结果:
I am is StaticMethod
zhangSan
-----------------------------
I am is StaticMethod
zhangSan
My name is wangWu
这种文章不宜过长,就写到这里,一天学一点,日积月累,今天的Python就学到这吧!明天再来学Python,哈哈。