组合

  1. class SchoolMember(object):
  2. def __init__(self,addr,tel):
  3. self.name = addr
  4. self.age = tel
  5. def tell(self):
  6. pass
  7. class Student(object):
  8. def __init__(self,name,age,sex):
  9. self.name = name
  10. self.age = age
  11. self.sex = sex
  12. def tell(self):
  13. print("Student :",self.name,self.age,self.sex)
  14.  
  15. class Teacher(SchoolMember):
  16. def __init__(self,addr,tel,student_obj): #
  17. super(Teacher,self).__init__(addr,tel)
  18. self.salary = addr
  19. self.coures = tel
  20. self.school_obj = student_obj
  21.  
  22. school = SchoolMember("北京",13800000000)
  23. student = Student("alex",33,"MF")
  24. teacher = Teacher("北京",13800000000,student)
  25.  
  26. print(teacher.school_obj.name)
  27. teacher.school_obj.tell()

静态方法

只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性

通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法

  1. class Dog(object):
  2. def __init__(self,name):
  3. self.name = name
  4. @staticmethod #实际上跟类没什么关系了
  5. def eat(self):
  6. print("%s is eating %s" %(self.name,"bb"))
  7.  
  8. d = Dog("aa")
  9. d.eat(d)

类方法  

类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量

  1. class Dog(object):
  2. n = 333
  3. def __init__(self,name):
  4. self.name = name
  5. #@staticmethod #实际上跟类没什么关系了
  6. @classmethod
  7. def eat(self):
  8. print("%s is eating %s" %(self.n,"bb"))
  9.  
  10. def talk(self):
  11. print("%s is talking" %self.name)
  12. d = Dog("aa")
  13. d.eat()

属性方法  

 属性方法的作用就是通过@property把一个方法变成一个静态属性

  1. class Dog(object):
  2. n = 333
  3. def __init__(self,name):
  4. self.name = name
  5. self.__food = None
  6. @property #@attribute
  7. def eat(self):
  8. print("%s is eating %s" %(self.name,self.__food))
  9. @eat.setter
  10. def eat(self,food):
  11. print("set to food:",food)
  12. self.__food = food
  13. @eat.deleter
  14. def eat(self):
  15. del self.__food
  16. print("删完了")
  17. def talk(self):
  18. print("%s is talking" %self.name)
  19. d = Dog("aa")
  20. d.eat="bb"
  21. d.eat
  22. del d.eat

类的特殊成员方法

1. __doc__  表示类的描述信息

  1. class Foo:
  2. """ 描述类信息"""
  3.  
  4. def func(self):
  5. pass
  6.  
  7. print (Foo.__doc__)
  8. #输出:描述类信息

  

2. __module__ 和  __class__ 

  __module__ 表示当前操作的对象在那个模块

  __class__     表示当前操作的对象的类是什么

3. __init__ 构造方法,通过类创建对象时,自动触发执行。

4.__del__

 析构方法,当对象在内存中被释放时,自动触发执行。

5. __call__ 对象后面加括号,触发执行。

注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

6. __dict__ 查看类或对象中的所有成员  

print(Dog.__dict__) #打印类里的所有属性,不包括实例变量

print(d.__dict__)   #打印类里的实例变量,不包括类属性

  1. class Dog(object):
  2. '''sadf asdf '''
  3. n = 333
  4. def __init__(self,name):
  5. self.name = name
  6. self.__food = None
  7. #@staticmethod #实际上跟类没什么关系了
  8. #@classmethod
  9. @property #@attribute
  10. def eat(self):
  11. print("%s is eating %s" %(self.name,self.__food))
  12. @eat.setter
  13. def eat(self,food):
  14. print("set to food:",food)
  15. self.__food = food
  16. @eat.deleter
  17. def eat(self):
  18. del self.__food
  19. print("删完了")
  20. def talk(self):
  21. print("%s is talking" %self.name)
  22. d = Dog("aa")
  23.  
  24. print(Dog.__dict__)
  25. print(d.__dict__)
  26. #输出
  27. {'__dict__': <attribute '__dict__' of 'Dog' objects>, '__weakref__': <attribute '__weakref__' of 'Dog' objects>, 'n': 333, '__doc__': 'sadf asdf ', '__module__': '__main__', '__init__': <function Dog.__init__ at 0x006AE300>, 'talk': <function Dog.talk at 0x006AE390>, 'eat': <property object at 0x006A6F90>}
  28. #输出
  29. {'name': 'aa', '_Dog__food': None}

7.__str__ 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。

  1. class Foo:
  2.  
  3. def __str__(self):
  4. return 'alex li'
  5.  
  6. obj = Foo()
  7. print obj
  8. # 输出:alex li

8.__getitem__、__setitem__、__delitem__

用于索引操作,如字典。以上分别表示获取、设置、删除数据

  1. class Foo(object):
  2.  
  3. def __getitem__(self, key):
  4. print('__getitem__',key)
  5.  
  6. def __setitem__(self, key, value):
  7. print('__setitem__',key,value)
  8.  
  9. def __delitem__(self, key):
  10. print('__delitem__',key)
  11.  
  12. obj = Foo()
  13.  
  14. result = obj['k1'] # 自动触发执行 __getitem__
  15. obj['k2'] = 'alex' # 自动触发执行 __setitem__
  16. del obj['k1']

  

反射

hasattr(obj,name_str) #判断一个对象里是否有对应的name_str字符串的方法映射
getattr(obj,name_str) #根据字符串去获取obj对象里的对应的方法的内存地址
setattr(obj,"y",z),is equivalent(相当于) (to) ``x.y = v''
 
异常处理
  1. try:
  2. print(info["aaa"])
  3. except KeyError as e:
  4. print("位置错误")
  5. except IndexError as e:
  6. print("biebiaocuowu",e)
  7. except (IndexError,KeyError) as e: #当两种错误,有统一的处理可以写一起
  8. print("统一错误",e)
  9. except Exception as e: #抓住所有错误 ,不建议用
  10. print("处错了",e) #只能自己找
  11. except Exception: #位置错误,用在最后面,抓未知的错误
  12. print("未知错误")
  13. else: #没有错误时,执行这个
  14. print("一切正常")
  15. finally:
  16. print("不管有没有错都执行")

自定义异常

  1. class AlexException(Exception):
  2. def __init__(self,msg):
  3. self.message = msg
  4. def __str__(self):
  5. return self.message
  6. try:
  7. raise AlexException ("我是异常")
  8. except AlexException as e:
  9. print(e)

 参考 http://www.cnblogs.com/wupeiqi/articles/5017742.html

Socket 编程

  • TCP服务端
  1. 创建套接字,绑定套接字到本地IP与端口
  2. 开始监听连接
  3. 进入循环,不断接受客户端的连接请求
  4. 然后接收传来的数据,并发送给对方数据
  5. 传输完毕后,关闭套接字
  • TCP客户端
  1. 创建套接字,连接远端地址
  2. 连接后发送数据和接收数据
  3. 传输完毕后,关闭套接字

多个用户交互

  1. import socket
  2. server = socket.socket()
  3. server.bind(('localhost',6868))#绑定要监听的端口
  4. server.listen()#监听
  5. while True:
  6. print("我要开始等电话了")
  7. conn,addr = server.accept()#等待接收
  8. print(conn,addr)
  9. #conn就是客户端连过来而在服务器端为其生成的一个连接实例
  10. print("电话来了")
  11. while True:
  12. data = conn.recv(1024)
  13. print("recv:",data.dacode())
  14. if not data:
  15. print("client has lost...")
  16. break
  17. conn.send(data.upper())
  18. server.close()

服务器端

  1. import socket
  2. #客户端
  3. client = socket.socket()#声明socket类型,同时生成socket连接对象
  4. client.connect(('localhost',6868))
  5. while True:
  6. info_input = input(">>>请输入").strip()
  7. if len(info_input) == 0 :
  8. continue
  9. client.send(info_input.encode("utf-8"))#python3中只能传字节
  10. data = client.recv(1024)
  11. print("recv:",data.decode())
  12. client.close()

客户端

参考:http://www.cnblogs.com/wupeiqi/articles/5040823.html

Python 面向对象编程进阶的更多相关文章

  1. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

  2. Python 面向对象编程(进阶部分)

    静态方法: 通过 @staticmethod 装饰器即可把其装饰的方法变为一个静态方法.普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实 ...

  3. 进击的Python【第七章】:Python的高级应用(四)面向对象编程进阶

    Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 ...

  4. Day7 - Python基础7 面向对象编程进阶

    Python之路,Day7 - 面向对象编程进阶   本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...

  5. 【转】python 面向对象(进阶篇)

    [转]python 面向对象(进阶篇) 上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 ...

  6. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

  7. python 面向对象编程(一)

    一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...

  8. Python面向对象编程指南

    Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...

  9. Python面向对象编程(下)

    本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...

随机推荐

  1. Crystal Reports 2008(水晶报表) 第一个报表

    学习Craystal Reports 2008的时候,光看说明文档,很多东西看了就忘了. 我在看文档的时候,是跟着文档上面来做的. 这样边看边做,效果还不错哈 下面就是我的第一个demo 先看看效果: ...

  2. Ajax分页js代码

    var pageIndex = 0; var pageSize = 10; $(function () { $("#btnSearch").click(function () { ...

  3. 李洪强iOS经典面试题126

    1.#import和#include的区别,@class代表什么? @class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import 而#import比起#inc ...

  4. javascript问题积累

    今天在写网页时碰到了几个js可以解决的小问题,很好用,很简便 1.鼠标移动到图片上时可更换图片,比如用到给图片加颜色,去颜色. <img src="../img/02.gif" ...

  5. HTML基础--JS简介、基本语法、类型转换、变量、运算符、分支语句、循环语句、数组、函数、函数调用.avi

    JS简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司(已被Oracle收 ...

  6. Unique Binary Search Trees

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  7. backbone学习笔记一

    backbone是一个MVC单页面框架,针对传统的WEB开发B/S架构的缺点,即通过表现层的浏览器,功能层的WEB服务器,数据层的数据库服务器构架,而操作渲染过程太过复杂.

  8. CMS .NET 程序框架 从2.0/3.5升级到4.0 版本后 需要调整的地方

    问题一: document.forms1.action 不可使用 需要修改程 document.forms[0] .NET 程序框架 从2.0/3.5升级到4.0 版本后,document.forms ...

  9. Android课程---第一课

    Android是一种基于Linux的开源的操作系统 主要使用于智能设备,如智能手机.平板电脑和智能电视等 由Google公司领头开发并推广,2008年推出第一个版本. 此系统最初由”安卓之父" ...

  10. 深入分析 Java 中的中文编码问题

    登录 (或注册) 中文 IBM 技术主题 软件下载 社区 技术讲座 打印本页面 用电子邮件发送本页面 新浪微博 人人网 腾讯微博 搜狐微博 网易微博 Digg Facebook Twitter Del ...