第七天 面向对象进阶与socket编程

1.静态方法(用得少)(解除某个函数跟类的关联,加了静态方法后,类便不能将类的参数传给静态方法函数了)

class Dog(object):

  def __init__(self,name):  

  @staticmethod   #下边的函数就是静态方法,但是下边的eat函数跟Dog类没有关联了,只是调用eat的时候,需要实例化Dog类再调用,eat不能再调用Dog类的任何参数和函数了

def eat(self,food):

    print("%s is eating %s " %(self.name,food))

2.类方法(用得少)

class Dog(object):

  name = "wt"

  def __init__(self,name):  

    pass

  @classmethod   #下边的函数就是类方法,但是类方法只能调用类变量,不能调用实例化的时候传的新参数

def eat(self,food):

    print("%s is eating %s " %(self.name,food))

3.属性方法(用得少)

class Dog(object):

  name = "wt"

  def __init__(self,name): 

    pass 

  @property#将下边的函数变为属性,调用该函数的时候,该函数不用加括号了。

def eat(self):

    print("%s is eating %s " %(self.name)

调用:

e = Dog

e.eat

给eat函数赋值

class Dog(object):

  def __init__(self,name): 

    self.name = name

    self.__food = None 

  @property#将下边的函数变为属性,调用该函数的时候,该函数不用加括号了。

def eat(self):

    print("%s is eating %s " %(self.name)

  @eat.setter #给属性函数赋值或修改赋值,必须创建一个函数

  def eat(self,food):

    self .__food = food

  @eat.deleter   #删除属性变量

  def eat(self):

    del self.__food

调用:

e = Dog

e.eat = "包子"#给属性函数赋值

e.eat

4.__doc__打印类的描述信息

__module__ 和  __class__ 

  obj.__module__ 查看当前操作对象obj是在哪个模块中

  obj.__class__     查看当前操作的对象obj的类是什么

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

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

6.__dict__

类.__dict__:打印类的所有函数和变量

实例.__dict__:查看实例的所有属性

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

8.__getitem__、__setitem__、__delitem__

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

+ ?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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‘

8.创建类就可以有两种方式:

a). 普通方式

?


1

2

3

4

class Foo(object):

 

    def func(self):

        print ‘hello alex‘

b). 特殊方式

?


1

2

3

4

5

6

7

def func(self):

    print ‘hello wupeiqi‘

 

Foo = type(‘Foo‘,(object,), {‘func‘: func})

#type第一个参数:类名

#type第二个参数:当前类的基类

#type第三个参数:类的成员

    将两个函数合成一个类:

def func(self):
    print("hello %s"%self.name)

def __init__(self,name,age):
    self.name = name
    self.age = age
Foo = type(‘Foo‘,(object,),{‘func‘:func,‘__init__‘:__init__})

f = Foo("jack",22)
f.func()

So ,孩子记住,类 是由 type 类实例化产生

那么问题来了,类默认是由 type 类实例化产生,type类中如何实现的创建类?类又是如何创建对象?

答:类中有一个属性 __metaclass__,其用来表示该类由 谁 来实例化创建,所以,我们可以为 __metaclass__ 设置一个type类的派生类,从而查看 类 创建的过程。

11.__new__():创建新实例

  __init__():初始化实例

class MyType(type):

    def __init__(self, what, bases=None, dict=None):

        print("--MyType init---")

        super(MyType, self).__init__(what, bases, dict)

    def __call__(self, *args, **kwargs):

        print("--MyType call---")

        obj = self.__new__(self, *args, **kwargs)

        self.__init__(obj, *args, **kwargs)

class Foo(object):

    __metaclass__ = MyType

    def __init__(self, name):

        self.name = name

        print("Foo ---init__")

    def __new__(cls, *args, **kwargs):  #这里的cls是Foo

        print("Foo --new--")

        return object.__new__(cls)

# 第一阶段:解释器从上到下执行代码创建Foo类

# 第二阶段:通过Foo类创建obj对象

obj = Foo("Alex")

12.反射:通过字符串来映射内存中的对象,银狐用户输入的是字符串,通过这种方法来修改程序运行时的状态、属性、方法, 有以下4个方法:

class Foo(object):

    def __init__(self):
        self.name = ‘wupeiqi‘

    def func(self):
        print ("haha")

obj = Foo()

# #### 检查一个对象里是否含有对应的函数 ####
hasattr(obj, ‘name‘)#检查对象obj里是否还有变量name,有则返回True
hasattr(obj, ‘func‘)

# #### 获取成员 ####
getattr(obj, ‘name‘)
getattr(obj, ‘func‘)#返回函数func的内存地址,加括号运行函数
getattr(obj,‘func‘)()执行该函数
# #### 设置成员 ####在类的外边定义一个函数hellodef hello():  print("hello")setattr(obj, ‘age‘, 18)#格式:(实例名,变量名,值) 修改age的值为18
setattr(obj, ‘func‘, hello)#将func函数替换为hello函数

obj.func()#执行func函数,obj为类的实例
输出:hello,而不是原来的haha

# #### 删除成员 ####
delattr(obj, ‘name‘)#删除实例的name变量,用hasattr(obj, ‘name‘)测试发现,返回False,说明‘name’已经被删除

delattr(obj, ‘func‘)#删除实例的func函数

13.异常处理:

try:

  pass

except Exception as e:#(python3里是as  不知道是什么类型错误的时候用Exception)

  print e#  e是错误的详细信息

常用异常类型:

AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的

14.

try:

  pass

except:

  pass

finally:

  print("ddd")#执行完try或except后,都要执行finally

15.自定义异常

class  WupeiqiException (Exception):

    def __init__(self, msg):

        self.message = msg

    def __str__(self):

        return self.message

try:

    raise  WupeiqiException(‘自定义语句我的异常‘)   #raise主动触发异常

except WupeiqiException as e:

    print (e)

16.socket通信

服务端:

import socketserver = socket.socket()server.bind((‘localhost‘,6666))server.listen(1)

print("我在等。。。")conn, addr = server.accept()print(conn,addr)

print("电话来了!")data = conn.recv(1024)print("recv:", data.decode())conn.send(data.upper())

server.close()

输出:

我在等。。。
<socket.socket object, fd=564, family=2, type=1, proto=0> (‘127.0.0.1‘, 56397)
电话来了!
recv: b‘hello world‘

客户端:

import socket

client = socket.socket()client.connect((‘localhost‘,6666))

client.send(‘你好‘.encode(‘utf-8‘))data = client.recv(1024)print("recv:", data)

client.close()

输出:recv: b‘HELLO WORLD‘


              
时间: 2024-10-11 02:09:48

第七天 面向对象进阶与socket编程的相关文章

Python基础-第七天-面向对象编程进阶和Socket编程简介

本篇内容: 1.面向对象编程进阶-静态方法 2.面向对象编程进阶-类方法 3.面向对象编程进阶-属性方法 4.面向对象编程进阶-特殊成员(内置方法) 5.面向对象编程进阶-反射 6.异常处理.断言 7.Socket编程简介 一.面向对象编程进阶-静态方法 1.静态方法的实现 通过@staticmethod装饰器可以把其装饰的方法变为一个静态方法: 变成静态方法后,形参中可以不用写self了.如果写了self,默认是不会把对象本身传递给self,需要手动传递: class Dog(object):

Python面向对象进阶和socket网络编程-day08

写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __init__(self,name): self.name=name p = Chinese('standby') # 实例化一个对象 print(p) # 打印这个对象 --- <__main__.Chinese object at 0x0000000000B3A978> - 示例2: >&g

Python-Day7 面向对象进阶/异常处理/Socket

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

Python面向对象进阶之高级编程

__slots__:定义类时,使用__slots__变量可以限制能添加的实例的属性 形如:__slots__ = ['name','age'] 这样实例化的对象只能绑定到name和age属性,其他属性则无法被绑定 class People:     __slots__ = ['name','age']     def __init__(self,name,age):         self.name = name         self.age = age p = People('laowa

python3.x 基础七:面向对象进阶

类的高级方法: 1.静态方法:在类方法前增加关键字@staticmethod,将普通方法变成静态方法,不能再次传值,不能访问实例变量或者类变量,与类的关系仅仅是通过类名进行调用 2.类方法:在类方法前增加关键字@classmethod,类方法只能访问类变量,不能访问实例变量 3.属性方法:(重点)在类方法前增加关键字@property,调用的时候通过属性一样的方式访问(去掉括号调用),可以通过类私有属性加@setter重新赋值,@deleter删除私有属性后方能删除属性方法 静态方法: clas

Python学习笔记——基础篇【第七周】———FTP作业(面向对象编程进阶 &amp; Socket编程基础)

FTP作业 本节内容: 面向对象高级语法部分 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 参考:http://www.cnblogs.com/wupeiqi/p/4766801.html metaclass 详解文章:http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python 得票最高那个答案写的非常好 Socket 编程 参考:http://www.cnblogs.co

python进阶---Python中的socket编程(一)

初识socket编程 一.前言 socket基于C\S架构(客户端\服务端)的编程模型,在Python中是以socket模块存在的. Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议. 所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规

J2SE快速进阶——Socket编程入门(TCP/UDP)

作品展时,我们的作品 "超级飞聊" 的主打功能就是聊天,包括局域网聊天.外网聊天等,虽然那时是用VB实现的(winsock控件),不过每种编程中的思想还是大同小异的,所以学习Java中的Socket编程时,倍感亲切啊. 概念了解 Socket又称"套接字",用来向网络中的主机发出请求或者应答网络中发出的请求. 文章开头先来简单了解一下TCP与UDP这两个协议: TCP TCP(Transmission Control Protocol传输控制协议)是一种面向连接的.

Python【day7】:Python学习(面向对象进阶、反射、socket介绍)

面向对象进阶 1.类变量和实例变量 # 一.变量 # 变量包括:实例变量和类变量, # 他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, # 实例变量属于对象 # 类变量属于类 class Province(object): country = "中国" #类变量 def __init__(self, name): self.name = name # 实例变量 # 直接访问实例变量(实例名来调用) obj = Province('河北省') print(obj.na