python学习--进阶篇

本文深入探讨 Python 的高级特性,包括面向对象编程中的类与对象管理、私有变量、继承与多态实现等核心概念,并介绍序列化及文件操作等实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不能这样diaosi的写python的基础了,要学学python高端大气上档次的东西,要看看我用python能做啥,早就听说豆瓣的牛人将大名鼎鼎的spark用python重写了一个版本dpark, 这里有源码,所以,我们的目的是:看懂他的代码!学习牛人的python编码方式!但是这还不是本文的目的,因为本文还处在python进阶的学习阶段。
1,面向对象:
当调用某个类中的方法的时候,如果不指定self的值的时候,内部会将这个函数重写(也就是在函数的第一个参数加一个self的参数)
2,__init__就相当于java和c++中的constructor,__init__函数并没有被显示的调用,而是在对象在被创建的时候自动被调用的,比如下面代码:
  1. class person():
  2.     def __init__(self,name):
  3.         self.name=name
  4.     def sayhello(self):
  5.         print "hello cdcdcd"

  6. p=person("zhanglei")
  7. p.sayhello()
3,前面说的基本是类和对象的function部分,看看数据部分:两种变量,类的变量和对象的变量
类的变量:和C++和java中的static,就是所有的对象或者实例都能共享使用,所以如果有某个对象对这种变量做了改动,改动会反映到其他的实例上
对象的变量:每个对象拥有自己对这个变量的一份拷贝,不是共享的,如果是类的变量,那就是没有拷贝
例如:可以看见name是通过self传进去的,也就是传进了self的实例中,这样的话name就是实例的变量,而school是类的变量,在school前面要加上"std."
  1. class std:
  2.     school=0
  3.     def __init__(self,name):
  4.         self.name=name
  5.     def add(self):
  6.         print self.name+'is coming'
  7.         std.school+=1
  8.         print std.school
  9.     def delete(self):
  10.         print self.name+'is leaving'
  11.         std.school-=1
  12.         print std.school

  13. std1=std("mike")
  14. std1.add()

  15. std2=std("tom")
  16. std2.delete()
4,__del__是和__init__函数对应的,是和C++,java中的destructor概念相似的,也可以显示的使用del去释放一个实例的所有资源,很难保证__del__是在什么时候使用
5,在python中,默认所有的数据成员都是公共的,只有一个例外:
如果你只想在类或者对象中使用某一个变量,那就可以变为私有的,方法就是在变量名前加两个下划线__。
6,继承:
  1. class schoolmem:
  2.     def __init__(self,name,num):
  3.         self.name=name
  4.         self.num=num
  5.     def havelunch(self):
  6.         print "ok, I am eatting"

  7. class student(schoolmem):
  8.     def __init__(self,name,num,pay):
  9.         schoolmem.__init__(self, name, num)
  10.         self.pay=pay
  11.     def paycao(self):
  12.         print 'lll'
  13. #         print 'i am get "%d"' % self.pay
  14.     def jj(self):
  15.         print 'cao'
  16.     def havelunch(self):
  17.         schoolmem.havelunch(self)
  18.         print 'have lunch'
  19.         
  20. class teacher(schoolmem):
  21.     def __init__(self,name,num,salary):
  22.         schoolmem.__init__(self, name, num)
  23.         self.salary=salary     
  24.     def salarycao(self):
  25.         print 'i am get "%d"' % self.salary
  26.     def havelunch(self):
  27.         print 'i am lunch'
  28.         print self.name
  29.         
  30. student1=student("zhangcasa",1,123)
  31. student1.havelunch()

  32. teacher1=teacher("pop",2,234)
  33. teacher1.salarycao()
  34. teacher1.havelunch()
可见,基类就像一个参数传进去一样,基类的__init__方法专门使用self变量,这样我们就可以初始化对象的基类部分,注意,python不会自动调用基类的constructor
如果基类中有函数func1,然后集成它的子类也有这个函数,这样的话,就是调用的时候,先是看子类中能不能找到对应的方法,如果不能,再去基类中逐个查找。
7,如果你想从用户那里得到标准输入和向标准输出写,在python中先当于C++中的cin,cout的函数是raw_iput和print函数,但是文件的输出和输入呢?如果没有给“写”还是“读”,默认就是读,readline()是读一行,write是写进文件中。
  1. data='cdcduchduhcudhuchduc'
  2. data1='''\ok. i am so ok'''
  3. f=file('/home/casa/data.txt','w')
  4. f.write(data)
  5. f.close

  6. f=file('/home/casa/data.txt')
  7. while True:
  8.     line=f.readline()
  9.     if len(line)==0:
  10.         break
  11.     print line
  12. f.close()
8,序列化,这十个高级玩意,在C++中写的那么费劲,在python中非常轻松的就搞定了,所以这个是高级语言的优势:但是我在调这段代码中有一个问题,暂时自己还不知道为什么。下面的12行如果将f换成f1,14行f换成f1,按理来说这个应该没有错,这里是为什么呢?为什么不能有另一个名字呢?
  1. import cPickle as p
  2. class pp:
  3.     def __init__(self,name):
  4.         self.name=name
  5.     def run(self):
  6.         print 'fuck, I am running'
  7.  
  8. pp1=pp("zhangcasa")
  9. pp1.run()
  10. f=file('/home/casa/data.xt','w')
  11. p.dump(pp1, f)
  12. f=file('/home/casa/data.xt')
  13. pp1.run()
  14. pp_1=p.load(f)
  15. pp_1.run()
  16. f.close
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值