Python 面向对象编程进阶
组合
- class SchoolMember(object):
- def __init__(self,addr,tel):
- self.name = addr
- self.age = tel
- def tell(self):
- pass
- class Student(object):
- def __init__(self,name,age,sex):
- self.name = name
- self.age = age
- self.sex = sex
- def tell(self):
- print("Student :",self.name,self.age,self.sex)
- class Teacher(SchoolMember):
- def __init__(self,addr,tel,student_obj): #
- super(Teacher,self).__init__(addr,tel)
- self.salary = addr
- self.coures = tel
- self.school_obj = student_obj
- school = SchoolMember("北京",13800000000)
- student = Student("alex",33,"MF")
- teacher = Teacher("北京",13800000000,student)
- print(teacher.school_obj.name)
- teacher.school_obj.tell()
静态方法
只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性
通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法
- class Dog(object):
- def __init__(self,name):
- self.name = name
- @staticmethod #实际上跟类没什么关系了
- def eat(self):
- print("%s is eating %s" %(self.name,"bb"))
- d = Dog("aa")
- d.eat(d)
类方法
类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量
- class Dog(object):
- n = 333
- def __init__(self,name):
- self.name = name
- #@staticmethod #实际上跟类没什么关系了
- @classmethod
- def eat(self):
- print("%s is eating %s" %(self.n,"bb"))
- def talk(self):
- print("%s is talking" %self.name)
- d = Dog("aa")
- d.eat()
属性方法
属性方法的作用就是通过@property把一个方法变成一个静态属性
- class Dog(object):
- n = 333
- def __init__(self,name):
- self.name = name
- self.__food = None
- @property #@attribute
- def eat(self):
- print("%s is eating %s" %(self.name,self.__food))
- @eat.setter
- def eat(self,food):
- print("set to food:",food)
- self.__food = food
- @eat.deleter
- def eat(self):
- del self.__food
- print("删完了")
- def talk(self):
- print("%s is talking" %self.name)
- d = Dog("aa")
- d.eat="bb"
- d.eat
- del d.eat
类的特殊成员方法
1. __doc__ 表示类的描述信息
- class Foo:
- """ 描述类信息"""
- def func(self):
- pass
- print (Foo.__doc__)
- #输出:描述类信息
2. __module__ 和 __class__
__module__ 表示当前操作的对象在那个模块
__class__ 表示当前操作的对象的类是什么
3. __init__ 构造方法,通过类创建对象时,自动触发执行。
4.__del__
析构方法,当对象在内存中被释放时,自动触发执行。
5. __call__ 对象后面加括号,触发执行。
注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
6. __dict__ 查看类或对象中的所有成员
print(Dog.__dict__) #打印类里的所有属性,不包括实例变量
print(d.__dict__) #打印类里的实例变量,不包括类属性
- class Dog(object):
- '''sadf asdf '''
- n = 333
- def __init__(self,name):
- self.name = name
- self.__food = None
- #@staticmethod #实际上跟类没什么关系了
- #@classmethod
- @property #@attribute
- def eat(self):
- print("%s is eating %s" %(self.name,self.__food))
- @eat.setter
- def eat(self,food):
- print("set to food:",food)
- self.__food = food
- @eat.deleter
- def eat(self):
- del self.__food
- print("删完了")
- def talk(self):
- print("%s is talking" %self.name)
- d = Dog("aa")
- print(Dog.__dict__)
- print(d.__dict__)
- #输出
- {'__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>}
- #输出
- {'name': 'aa', '_Dog__food': None}
7.__str__ 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。
- class Foo:
- def __str__(self):
- return 'alex li'
- obj = Foo()
- print obj
- # 输出:alex li
8.__getitem__、__setitem__、__delitem__
用于索引操作,如字典。以上分别表示获取、设置、删除数据
- class Foo(object):
- def __getitem__(self, key):
- print('__getitem__',key)
- def __setitem__(self, key, value):
- print('__setitem__',key,value)
- def __delitem__(self, key):
- print('__delitem__',key)
- obj = Foo()
- result = obj['k1'] # 自动触发执行 __getitem__
- obj['k2'] = 'alex' # 自动触发执行 __setitem__
- del obj['k1']
反射
- try:
- print(info["aaa"])
- except KeyError as e:
- print("位置错误")
- except IndexError as e:
- print("biebiaocuowu",e)
- except (IndexError,KeyError) as e: #当两种错误,有统一的处理可以写一起
- print("统一错误",e)
- except Exception as e: #抓住所有错误 ,不建议用
- print("处错了",e) #只能自己找
- except Exception: #位置错误,用在最后面,抓未知的错误
- print("未知错误")
- else: #没有错误时,执行这个
- print("一切正常")
- finally:
- print("不管有没有错都执行")
自定义异常
- class AlexException(Exception):
- def __init__(self,msg):
- self.message = msg
- def __str__(self):
- return self.message
- try:
- raise AlexException ("我是异常")
- except AlexException as e:
- print(e)
参考 http://www.cnblogs.com/wupeiqi/articles/5017742.html
Socket 编程
- TCP服务端
- 创建套接字,绑定套接字到本地IP与端口
- 开始监听连接
- 进入循环,不断接受客户端的连接请求
- 然后接收传来的数据,并发送给对方数据
- 传输完毕后,关闭套接字
- TCP客户端
- 创建套接字,连接远端地址
- 连接后发送数据和接收数据
- 传输完毕后,关闭套接字
多个用户交互
- import socket
- server = socket.socket()
- server.bind(('localhost',6868))#绑定要监听的端口
- server.listen()#监听
- while True:
- print("我要开始等电话了")
- conn,addr = server.accept()#等待接收
- print(conn,addr)
- #conn就是客户端连过来而在服务器端为其生成的一个连接实例
- print("电话来了")
- while True:
- data = conn.recv(1024)
- print("recv:",data.dacode())
- if not data:
- print("client has lost...")
- break
- conn.send(data.upper())
- server.close()
服务器端
- import socket
- #客户端
- client = socket.socket()#声明socket类型,同时生成socket连接对象
- client.connect(('localhost',6868))
- while True:
- info_input = input(">>>请输入").strip()
- if len(info_input) == 0 :
- continue
- client.send(info_input.encode("utf-8"))#python3中只能传字节
- data = client.recv(1024)
- print("recv:",data.decode())
- client.close()
客户端
参考:http://www.cnblogs.com/wupeiqi/articles/5040823.html
Python 面向对象编程进阶的更多相关文章
- python面向对象编程进阶
python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...
- Python 面向对象编程(进阶部分)
静态方法: 通过 @staticmethod 装饰器即可把其装饰的方法变为一个静态方法.普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实 ...
- 进击的Python【第七章】:Python的高级应用(四)面向对象编程进阶
Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 ...
- Day7 - Python基础7 面向对象编程进阶
Python之路,Day7 - 面向对象编程进阶 本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...
- 【转】python 面向对象(进阶篇)
[转]python 面向对象(进阶篇) 上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 ...
- python 面向对象编程学习
1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...
- python 面向对象编程(一)
一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...
- Python面向对象编程指南
Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...
- Python面向对象编程(下)
本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...
随机推荐
- Crystal Reports 2008(水晶报表) 第一个报表
学习Craystal Reports 2008的时候,光看说明文档,很多东西看了就忘了. 我在看文档的时候,是跟着文档上面来做的. 这样边看边做,效果还不错哈 下面就是我的第一个demo 先看看效果: ...
- Ajax分页js代码
var pageIndex = 0; var pageSize = 10; $(function () { $("#btnSearch").click(function () { ...
- 李洪强iOS经典面试题126
1.#import和#include的区别,@class代表什么? @class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import 而#import比起#inc ...
- javascript问题积累
今天在写网页时碰到了几个js可以解决的小问题,很好用,很简便 1.鼠标移动到图片上时可更换图片,比如用到给图片加颜色,去颜色. <img src="../img/02.gif" ...
- HTML基础--JS简介、基本语法、类型转换、变量、运算符、分支语句、循环语句、数组、函数、函数调用.avi
JS简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司(已被Oracle收 ...
- Unique Binary Search Trees
Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...
- backbone学习笔记一
backbone是一个MVC单页面框架,针对传统的WEB开发B/S架构的缺点,即通过表现层的浏览器,功能层的WEB服务器,数据层的数据库服务器构架,而操作渲染过程太过复杂.
- CMS .NET 程序框架 从2.0/3.5升级到4.0 版本后 需要调整的地方
问题一: document.forms1.action 不可使用 需要修改程 document.forms[0] .NET 程序框架 从2.0/3.5升级到4.0 版本后,document.forms ...
- Android课程---第一课
Android是一种基于Linux的开源的操作系统 主要使用于智能设备,如智能手机.平板电脑和智能电视等 由Google公司领头开发并推广,2008年推出第一个版本. 此系统最初由”安卓之父" ...
- 深入分析 Java 中的中文编码问题
登录 (或注册) 中文 IBM 技术主题 软件下载 社区 技术讲座 打印本页面 用电子邮件发送本页面 新浪微博 人人网 腾讯微博 搜狐微博 网易微博 Digg Facebook Twitter Del ...