• Python--day7


    1. 类的静态方法及属性

    多态:多态即为接口的重用(父类调用子类)


     1 #!/usr/bin/env python
     2 # encoding: utf-8
     3 class Animal:
     4     def __init__(self,name):
     5         self.name = name
     6     def talk(self):
     7         raise NotImplementedError("Subclass must implement abstract method")
     8 
     9 class Cat(Animal):
    10     def talk(self):
    11         return 'meow'
    12 class Dog(Animal):
    13     def talk(self):
    14         return 'Woof!Woof!'
    15 
    16 
    17 def animal_talk(obj):
    18     print(obj.talk())
    19 c = Cat("SanJiangMei")
    20 d = Dog("SanJiangYuan")
    21 animal_talk(c)
    22 animal_talk(d)
    23 
    24 或者:
    25 #animals = [Cat('Missy'),
    26 #           Dog('Lassie')]
    27 #for animal in animals:
    28 #   print(animal.name + ':' + animal.talk())
    View Code

    类的成员:字段(普通字段、静态字段)、方法(普通方法、类方法、静态方法)、属性
    字段也就是变量的意思,普通字段即实例变量。静态字段即类变量

    类的方法:
    1、@classmethod :类方法,不能访问实例变量
    2、@staticmethod :静态方法,不能访问类变量及实例变量
    3、@property :把方法变成属性
    把变量变成私有属性方法: 加入__即可 ,如果非要访问的话,那么在变量前边加上下划线及类名:_Animal__

    多继承
    #!/usr/bin/env python
    # encoding: utf-8
    class A:
    n = 'A'
    def f2(self):
    print("f2 from A")
    class B(A):
    n = 'B'
    def f1(self):
    print("from B")
    def f2(self):
    print("f2 from B")
    class C(A):
    n = 'C'
    def f2(self):
    print("from C")

    #类D同时继承B和C
    class D(B,C):#f2方法先找B然后找C,最后找A,这是广度优先
    #广度优先的意思为先找同级别,如果同级别没有了再找上一级别
    pass

    d = D()
    print(d.f1())
    print(d.f2())



    类的特殊成员:
    上文介绍了Python的类成员以及成员修饰符,从而了解到类中有字段、方法和属性三大类成员,并且成员名前如果有两个
    下划线,则表示该成员是私有成员,私有成员只能由类内部调用,无论人或事物往往都有不按套路出牌的情况,Python的
    类成员也是如此,存在着一些具有特殊含义的成员,详情如下:
    1、__doc__
     表示类的描述信息(打印类的注释信息、文档)
      例如:
      class D(B,C):#f2方法先找B然后找C,最后找A,这是广度优先
    #广度优先的意思为先找同级别,如果同级别没有了再找上一级别
    '''Test class'''
    pass

      d = D()
      print(d.__doc__)


    2、__module__和__class__
      __module__ 表示当前操作的对象在那个模块(表示所导入的模块的所在文件的文件名)
      #!/usr/bin/env python
      # encoding: utf-8
      from multi_inheritance import D
      a = D()
      print(a.__module__)

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

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

    4、__del__
      析构方法,当对象在内存中被释放时,自动触发执行。
      注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作
      都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的
    def __del__(self):#整个程序执行完后销毁
    print("deleteing the ...")
    5、__call__
      对象后面加括号,触发执行
      注:构造方法的执行是由创建对象触发的,即:对象=类名();而对于__call__方法的执行是由对象后加括号触发的,
      即:对象()或者类()
    6、__new__
      此方法会重构类,类中的__init__不会被执行初始化,类中的方法也不能执行
    7、__dict__
      类中的变量以字典的形式体现出来
    8、__str__  
      如果一个类中定义了__str__方法,那么在打印对象时,默认输出该方法的返回值。


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

    反射:
    
    
    #!/usr/bin/env python
    # encoding: utf-8
    import sys
    class Webserver(object):
    def __init__(self,host,port):
    self.host = host
    self.port = port

    def start(self):
    print("Server is starting...")
    def stop(self):
    print("Server is stopping...")
    def restart(self):
    self.stop()
    self.start()
    def test_run(self,name):
    print("running ...",name,self.host)


    if __name__ == '__main__':
    print(sys.argv[1])
    server = Webserver('localhost',333)
    #方法二:
    if hasattr(server,sys.argv[1]):#判断类中是否存在这个属性,如果存在即为真
    func = getattr(server,sys.argv[1])#getattr()作用是获取server.start的内存地址
    func()#相当于server.start()
    #setattr方法:
    # setattr(server,'run',test_run)#把test_run定义到类中
    # server.run(server,'shidong')

    #delete方法:只能删除自己的,不能删除类中的属性
    delattr(server,'host')
    print(server.host)

    delattr(Webserver,'start')
    print(server.restart())

    #方法一:
    # cmd_dic = {
    # 'start':server.start,
    # 'stop':server.stop
    # }
    # if sys.argv[1] in cmd_dic:
    # cmd_dic[sys.argv[1]]()
     

    Socket
    socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄,应用程序通过“套接字”向网络发出
    请求或者应答网络请求。
    socket起源于Unix,而unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式
    来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO
    、打开、关闭)
    3.0版本
    服务器端:
    #!/usr/bin/env python
    # encoding: utf-8
    import socket

    ip_port = ('127.0.0.1',9999)

    sk = socket.socket()#如果不指定,则默认为TCP/IP
    sk.bind(ip_port)
    sk.listen(5)

    while True:
    print("server waiting...")
    conn,addr = sk.accept()
    #等待连接进来,服务器会根据客户端连接生成专门的实例#一个客户端有一个专门的实例
    client_data = conn.recv(1024)#2014个字节
    print(str(client_data,'utf8'))
    conn.sendall(bytes('不要回答,不要回答,不要回答','utf8'))
    sk.close()
    客户端:
    #!/usr/bin/env python
    # encoding: utf-8
    import socket

    ip_port = ('127.0.0.1',9999)#ip 为服务端的地址

    sk = socket.socket()#如果不指定,则默认为TCP/IP
    sk.connect(ip_port)

    sk.sendall(bytes("请求占领地球",'utf8'))

    server_reply = sk.recv(1024)
    print(str(server_reply,'utf8'))

    sk.close()



    1 #!/usr/bin/env python
    2 # encoding: utf-8
    3 import os,sys,getpass,time
    View Code

    getpass模块

     

  • 相关阅读:
    rdesktop ERROR: CredSSP: Initialize failed, do you have correct kerberos tgt initialized ? Failed to connect, CredSSP required by server
    nginx 服务器重启命令,关闭
    Libvirt磁盘加密
    qemu-nbd使用教程
    交叉编译Spice-gtk
    通过Python调用Spice-gtk
    远程桌面连接KVM虚拟机
    虚拟创建失败之Dbus调试
    Libvirt代码架构
    Libvirt外部快照
  • 原文地址:https://www.cnblogs.com/sd880413/p/8075261.html
Copyright © 2020-2023  润新知