Py3 基础day7(continue0)

类:属性;

             实例变量

              类变量

              私有属性__var

         方法:

                构造方法

                析构函数

                私有方法

对象:实例化得到的一个对象;

继承

      继承,组合

      代码重用

     单继承

     多继承;3.X广度优先;;2.7经典类,深度优先;新式类,广度优先;

     多态:接口重用;;

静态方法:

class Dog(object):
    def __init__(self, name):
        self.name = name
    @staticmethod #实际上跟类没什么关系了
    def eat(self, food):
        print("%s is eating %s" % (self.name, food))

d = Dog("ChenRong")
d.eat()
以上程序无法执行;
静态方法:只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性;
类方法:只能访问类变量,不能访问实例变量;
class Dog(object):
    #n = "3333"
    name = "hauzai"
    def __init__(self, name):
        self.name = name
        #self.n = 333322
    #@staticmethod #实际上跟类没什么关系了
    @classmethod
    def eat(self):
        print("%s is eating %s" % (self.name,'baozi'))
d = Dog("ChenRong")
d.eat()
属性方法:把一个方法变成一个静态属性;
 
 
class Dog(object):
    def __init__(self, name):
        self.name = name
    #@staticmethod #实际上跟类没什么关系了
    #@classmethod
    @property #attribute
    def eat(self):
        print("%s is eating %s" % (self.name,'baozi'))


d = Dog("ChenRong")
d.eat
例子(调用属性,修改它,删除它)
class Dog(object):
    def __init__(self, name):
        self.name = name
    #@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("删除")

d = Dog("ChenRong")
d.eat= "none"
d.eat = "baozi"
d.eat
del d.eat
 
 
例子(属性方法)
class Flight(object):
    def __init__(self,name):
        self.flight_name = name


    def checking_status(self):
        print("checking flight %s status " % self.flight_name)
        return  1

    @property
    def flight_status(self):
        status = self.checking_status()
        if status == 0 :
            print("flight got canceled...")
        elif status == 1 :
            print("flight is arrived...")
        elif status == 2:
            print("flight has departured already...")
        else:
            print("cannot confirm the flight status...,please check later")

    @flight_status.setter #改状态
    def flight_status(self, status):
        print("flight %s has changed status to %s" % (self.flight_name,status))

f = Flight("CA980")
f.flight_status
f.flight_status = 2

类的特殊成员方法

1. __doc__  表示类的描述信息

2. __module__ 和  __class__ 

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

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

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

4.__del__

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

def __call__(self, *args, **kwargs):
    print("running call",args,kwargs)

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

print(Dog.__dict__) #打印类里的所有属性,不包括类的属性
print(d.__dict__)#打印所有实例属性,不包括类的属性
7.__str__ 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。
def __str__(self):
    return "obj:%s"%self.name

8.__getitem__、__setitem__、__delitem__

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

class Foo(object):
    def __init__(self):
        self.data = {}
    def __getitem__(self, key):
        print('__getitem__', key)
        return self.data.get(key)
    def __setitem__(self, key, value):
        print('__setitem__', key, value)
        self.data[key]  = value

    def __delitem__(self, key):
        print('__delitem__', key)

obj = Foo()
obj['name'] = "zhang"
print(obj['name'])
print(obj.data)
del obj["name"]
D:\Python\python36\python.exe D:/Python/work/day7/getitem.py
__setitem__ name zhang
__getitem__ name
zhang
{'name': 'zhang'}
__delitem__ name

9.__new__ \ __metaclass__

class Foo(object):
    def __init__(self, name):
        self.name = name
#f = Foo("zhang")
#print(type(f))
#print(type(Foo))
def func(self):
    print('hello zhang %s'%self.name)
def __init__(self,name,age):
    self.name = name
    self.age = age
Foo = type('Foo',(object,),{'talk':func,'__init__':__init__})
f = Foo("guoqi",23)
f.talk()
print(type(Foo))

类中有一个属性 __metaclass__,其用来表示该类由 谁 来实例化创建,所以,我们可以为 __metaclass__ 设置一个type类的派生类,从而查看 类 创建的过程。
class MyType(type):
      def __init__(self,*args,**kwargs):
          print("Mytype __init__",*args,**kwargs)

      def __call__(self, *args, **kwargs):
          print("Mytype __call__", *args, **kwargs)
          obj = self.__new__(self)
          print("obj ",obj,*args, **kwargs)
          print(self)
          self.__init__(obj,*args, **kwargs)
          return obj
      def __new__(cls, *args, **kwargs): #new 是用来创建实例的
        print("Mytype __new__",*args,**kwargs)
        return type.__new__(cls, *args, **kwargs)

print('here...')
class Foo(object,metaclass=MyType):
    def __init__(self,name):
        self.name = name
        print("Foo __init__")
    def __new__(cls, *args, **kwargs):
        print("Foo __new__",cls, *args, **kwargs)
        return object.__new__(cls) #继承父类的__new__方法
#第一阶段:解释器从上到下执行代码创建Foo#第二阶段:通过Foo类创建object对象
f = Foo("Alex")
print("f",f)
print("fname",f.name)

反射
class Dog(object):
    def __init__(self,name):
        self.name = name

    def eat(self,food):
        print("%s is eating..."%self.name,food)
d = Dog("alex")
choice = input(">>:").strip()
if hasattr(d,choice):
    func = getattr(d,choice)
    func("baozi")

hasattr(obj,name_str),判断一个对象obj是否有对应的name_str字符串的方法;

getattr(obj,name_str),根据字符串去获取obj对象里的方法的内存地址;

setattr(x, 'y', v) is equivalent to ``x.y = v'';

delattr(x, 'y') is equivalent to ``del x.y'';

def bulk(self):
    print("%s is yelling....."%self.name)
class Dog(object):
    def __init__(self,name):
        self.name = name
    def eat(self,food):
        print("%s is eating..."%self.name,food)
d = Dog("alex")
choice = input(">>:").strip()
if hasattr(d,choice):
    delattr(d,choice)
    #func = getattr(d,choice)
    #func("baozi")
    #setattr(d,choice,"huazi")
else :
    #setattr(d,choice,bulk)
    #d.talk(d)
    setattr(d,choice,None)
    print(getattr(d,choice))
#print(d.name)
#if choice == 'eat':
    #d.eat()

10.异常处理

try:
    data['name']
except KeyError as e:
    print("没有这个key",e)
try:
    names[3]
    data['name']
except KeyError as e:
    print("没有这个key",e)
except IndexError as e:
    print("列表错误",e)
抓住所有错误;
try:
    names[3]
    data['name']
except Exception as e:#抓住所有错误,不建议用;
    print("出错了",e)
总结:
try:
    names[3]
    data['name']
except Exception as e:
    print("出错了",e)
except KeyError as e:
    print("没有这个key",e)
except IndexError as e:
    print("列表错误",e)
except Exception as e:
    print("未知错误",e)
else:
    print("一切正常")
finally:

print("不管有没有错,都执行")

常用错误::

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

自定义异常:

class AlexException(Exception):
    def __init__(self,msg):
        self.message = msg

    def __str__(self):
        return "assdajk"
        #return self.message
try:
    raise AlexException('数据库连不上...')
except AlexException as e:
    print(e)
Socket网络编程

OSI七层:应用;表示;绘画;传输;网络ip;数据链路mac;物理层;;

TCP/IP   三次握手;四次断开;

UDP   

接受/发送数据的中转站;

65535port机器开放端口; import socket     (发送端)

                                          socket.TCP/IP

                                          connect(a.ip,a.port)

                                          socket.send(hello)

                                          socket.close()

                                          import  socket(服务器端)

                                          socket.TCP/IP

                                          listen(0.0.0.0,3306)

                                          waiting()

                                          recv()

                                          send

Socket Families(地址簇)

socket.AF_UNIX unix本机进程间通信 

socket.AF_INET IPV4 

socket.AF_INET6  IPV6

Socket Types

socket.SOCK_STREAM  #for tcp

socket.SOCK_DGRAM   #for udp 

socket.SOCK_RAW     #原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。

 例子::::

#服务端(socket_server)
import socket
server = socket.socket()
server.bind(('localhost',6969)) #绑定要监听的端口
server.listen() #监听
print("我要等电话了")
conn, addr = server.accept()
# conn就是客户端连过来而在服务端为其生成的一个连接对象
print(conn, addr)
# server.accept() #等电话打进来
print("电话来了")
while True:

    data = conn.recv(1024)
    print("recv:",data)
    conn.send(data.upper())

server.close()
————————————————————
#客户端(socket_client)
import socket
client = socket.socket() #声明socket类型,同时生成socket对象
client.connect(('localhost',6969))
while True:
    msg = input(">>:").strip()
    client.send(msg.encode("utf-8"))
    #client.send("我要自学".encode("utf-8"))
    data = client.recv(1024)
    print("recv:", data.decode())

client.close()


 

猜你喜欢

转载自blog.csdn.net/qq_37951246/article/details/80459006
今日推荐