组合

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']

  

反射

hasattr(obj,name_str) #判断一个对象里是否有对应的name_str字符串的方法映射
getattr(obj,name_str) #根据字符串去获取obj对象里的对应的方法的内存地址
setattr(obj,"y",z),is equivalent(相当于) (to) ``x.y = v''
 
异常处理
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服务端
  1. 创建套接字,绑定套接字到本地IP与端口
  2. 开始监听连接
  3. 进入循环,不断接受客户端的连接请求
  4. 然后接收传来的数据,并发送给对方数据
  5. 传输完毕后,关闭套接字
  • TCP客户端
  1. 创建套接字,连接远端地址
  2. 连接后发送数据和接收数据
  3. 传输完毕后,关闭套接字

多个用户交互

 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 面向对象编程进阶的更多相关文章

  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. 【BZOJ1208】[HNOI2004]宠物收养所 Splay

    还是模板题,两颗splay,找点删即可. #include <iostream> #include <cstdio> #include <cstdlib> #def ...

  2. Android -- ids.xml文件的使用

    1.当我们在使用控件的时候,有的时候不可避免的要为控件声明id ,而分散在各个xml文件中,有时候查找起来又不是特别的方便 ,因此,安卓为我们提供了ids.xml 文件,保存在res -->va ...

  3. children和childNodes的区别

    children和childNodes 1,childNodes 属性,标准的,它返回指定元素的子元素集合,包括HTML节点,所有属性,文本.可以通过nodeType来判断是哪种类型的节点,只有当no ...

  4. BZOJ4553: [Tjoi2016&Heoi2016]序列

    Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值 可能会变化,但同一个时刻最多只有一个值发生变化.现在佳媛姐姐已经研究出了所 ...

  5. spring源码学习之路---IOC初探(二)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章当中我没有提及具体的搭 ...

  6. qt编译常见错误

    一.fatal error: QWidget: 没有那个文件或目录 类似于找不到文件目录的,在.pro文件中添加 QT +=\ widgets 类似就可以编译通过

  7. Java 多继承

    浅浅地上了几天 Java 的课程,然后怎么也想不明白:Java 不支持多继承有和接口到底是什么样的关系? 一只牛的故事. // 叫的抽象基类 abstract class call{ } // 跑的抽 ...

  8. Aidl的使用步骤

    先说说Aidl传递参数类型 1.基本数据类型(除short类型) 2.String.charSequence 3.List,map 4.parcelable 第1步:定义一个*.aidl文件,ecli ...

  9. webapp 公共样式

    html{ font-size: 62.5%;}@media only screen and (min-width: 481px) { html { font-size:94%!important } ...

  10. 【iCore3 双核心板_ uC/OS-III】例程一:认识 uC/OS-III

    实验指导书及代码包下载: http://pan.baidu.com/s/1i4FuMep iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...