不能这样diaosi的写python的基础了,要学学python高端大气上档次的东西,要看看我用python能做啥,早就听说豆瓣的牛人将大名鼎鼎的spark用python重写了一个版本dpark,
这里有源码,所以,我们的目的是:看懂他的代码!学习牛人的python编码方式!但是这还不是本文的目的,因为本文还处在python进阶的学习阶段。
1,面向对象:
当调用某个类中的方法的时候,如果不指定self的值的时候,内部会将这个函数重写(也就是在函数的第一个参数加一个self的参数)
2,__init__就相当于java和c++中的constructor,__init__函数并没有被显示的调用,而是在对象在被创建的时候自动被调用的,比如下面代码:
1,面向对象:
当调用某个类中的方法的时候,如果不指定self的值的时候,内部会将这个函数重写(也就是在函数的第一个参数加一个self的参数)
2,__init__就相当于java和c++中的constructor,__init__函数并没有被显示的调用,而是在对象在被创建的时候自动被调用的,比如下面代码:
- class person():
-
def __init__(self,name): -
self.name=name -
def sayhello(self): -
print "hello cdcdcd" - p=person("zhanglei")
- p.sayhello()
3,前面说的基本是类和对象的function部分,看看数据部分:两种变量,类的变量和对象的变量
类的变量:和C++和java中的static,就是所有的对象或者实例都能共享使用,所以如果有某个对象对这种变量做了改动,改动会反映到其他的实例上
对象的变量:每个对象拥有自己对这个变量的一份拷贝,不是共享的,如果是类的变量,那就是没有拷贝
例如:可以看见name是通过self传进去的,也就是传进了self的实例中,这样的话name就是实例的变量,而school是类的变量,在school前面要加上"std."
- class std:
-
school=0 -
def __init__(self,name): -
self.name=name -
def add(self): -
print self.name+'is coming' -
std.school+=1 -
print std.school -
def delete(self): -
print self.name+'is leaving' -
std.school-=1 -
print std.school - std1=std("mike")
- std1.add()
- std2=std("tom")
- std2.delete()
4,__del__是和__init__函数对应的,是和C++,java中的destructor概念相似的,也可以显示的使用del去释放一个实例的所有资源,很难保证__del__是在什么时候使用
5,在python中,默认所有的数据成员都是公共的,只有一个例外:
如果你只想在类或者对象中使用某一个变量,那就可以变为私有的,方法就是在变量名前加两个下划线__。
6,继承:
- class schoolmem:
-
def __init__(self,name,num): -
self.name=name -
self.num=num -
def havelunch(self): -
print "ok, I am eatting" - class student(schoolmem):
-
def __init__(self,name,num,pay): -
schoolmem.__init__(self, name, num) -
self.pay=pay -
def paycao(self): -
print 'lll' - #
print 'i am get "%d"' % self.pay -
def jj(self): -
print 'cao' -
def havelunch(self): -
schoolmem.havelunch(self) -
print 'have lunch' -
- class teacher(schoolmem):
-
def __init__(self,name,num,salary): -
schoolmem.__init__(self, name, num) -
self.salary=salary -
def salarycao(self): -
print 'i am get "%d"' % self.salary -
def havelunch(self): -
print 'i am lunch' -
print self.name -
- student1=student("zhangcasa",1,123)
- student1.havelunch()
- teacher1=teacher("pop",2,234)
- teacher1.salarycao()
- teacher1.havelunch()
可见,基类就像一个参数传进去一样,基类的__init__方法专门使用self变量,这样我们就可以初始化对象的基类部分,注意,python不会自动调用基类的constructor
如果基类中有函数func1,然后集成它的子类也有这个函数,这样的话,就是调用的时候,先是看子类中能不能找到对应的方法,如果不能,再去基类中逐个查找。
7,如果你想从用户那里得到标准输入和向标准输出写,在python中先当于C++中的cin,cout的函数是raw_iput和print函数,但是文件的输出和输入呢?如果没有给“写”还是“读”,默认就是读,readline()是读一行,write是写进文件中。
- data='cdcduchduhcudhuchduc'
- data1='''\ok. i am so ok'''
- f=file('/home/casa/data.txt','w')
- f.write(data)
- f.close
- f=file('/home/casa/data.txt')
- while True:
-
line=f.readline() -
if len(line)==0: -
break -
print line - f.close()
8,序列化,这十个高级玩意,在C++中写的那么费劲,在python中非常轻松的就搞定了,所以这个是高级语言的优势:但是我在调这段代码中有一个问题,暂时自己还不知道为什么。下面的12行如果将f换成f1,14行f换成f1,按理来说这个应该没有错,这里是为什么呢?为什么不能有另一个名字呢?
- import cPickle as p
- class pp:
-
def __init__(self,name): -
self.name=name -
def run(self): -
print 'fuck, I am running' -
- pp1=pp("zhangcasa")
- pp1.run()
- f=file('/home/casa/data.xt','w')
- p.dump(pp1, f)
- f=file('/home/casa/data.xt')
- pp1.run()
- pp_1=p.load(f)
- pp_1.run()
- f.close