对象进阶

 

静态方法:只是名义上归类管理,实际在静态方法里访问不了类中的任何属性

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

class Dog(object):

 
    def __init__(self,name):
        self.name = name
 
    @staticmethod #把eat方法变为静态方法;实际和类没有关系了
    def eat(self):
        print("%s is eating" % self.name)
 
 
 
= Dog("ChenRonghua")
d.eat()
 

1. 调用时主动传递实例本身给eat方法,即d.eat(d) 

2. 在eat方法中去掉self参数,但这也意味着,在eat中不能通过self.调用实例中的其它变量了

 

类方法;

类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量

class Dog(object):

    def __init__(self,name):
        self.name = name
 
    @classmethod
    def eat(self):
        print("%s is eating" % self.name)

 ----------------------------------------------------------------------------

属性方法;

属性方法的作用就是通过@property把一个方法变成一个静态属性

class Dog(object):
def __init__(self,name):
self.name = name
self.__food=None
@property
def eat(self):
print(" %s is eating" % self._food)
@eat.setter
def eat(self,food):
print("set eat to eat",food)
self.__food=food
@eat.deleter
def eat(self):
del self.__food
print("删除eat成功")
d = Dog("ChenRonghua")
d.eat='小强'
del d.eat
d.eat
调用会出以下错误, 说NoneType is not callable, 因为eat此时已经变成一个静态属性了, 不是方法了, 想调用已经不需要加()号了,直接d.eat就可以了
 

 __doc__  表示类的描述信息

class Foo:

    """ 描述类信息,这是用于看片的神奇 """
 
    def func(self):
        pass
 
print Foo.__doc__
#输出:类的描述信息

__module__ 和  __class__ 

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

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

from lib.aa import C

obj = C()
print obj.__module__  # 输出 lib.aa,即:输出模块
print obj.__class__      # 输出 lib.aa.C,即:输出类


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

4.__del__

析构方法,当对象在内存中被释放时,自动触发执行。

此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的
 
 5. __call__ 
对象后面加括号,触发执行。构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
 

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

# -*- coding:utf-8 -*-
class walker(object):
def __init__(self,name,age):
self.name=name
self.age=age
def page(self):
print("page1")
print(walker.__dict__) #获取类的成员,即:静态字段、方法、
w=walker("zhang","18")
print(w.__dict__) ## 获取 对象obj1 的成员

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

class Foo:

     def __str__(self):
        return 'alex li
obj = Foo()
print obj
# 输出:alex li
 
8

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

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

 

反射

反射是一个很重要的概念,它可以把字符串映射到实例的变量或者实例的方法然后可以去执行调用、修改等操作。它有四个重要的方法:

  • getattr 获取指定字符串名称的对象属性
  • setattr 为对象设置一个对象
  • hasattr 判断对象是否有对应的对象(字符串)
  • delattr 删除指定属性
# -*- coding:utf-8 -*-
class Dog(object):
def __init__(self,name):
self.name=name
def eat(self,food):
print("%s is eating %s\n" % (self.name,food))
def talk(self):
print("what is swiming")
d=Dog("big huang")

choice=input("which methord is useing\n")
if hasattr(d,choice):
# func=getattr(d,choice) #假如是方法则调用方法执行
# func('rice')
print('存在')
setone=setattr(d,choice,"xiao qiang") #给属性赋值;也可以赋值不存在的方法
print(getattr(d,choice))
delattr(d,choice)#删除之后再调用,报错
if not hasattr(d,choice): #判断是否已删除
print("已经删除成功")
else:
setattr(d,choice,talk) #假如方法不存在,则设置新的方法
getattr(d,choice)(d)
print("不存在这个方法")


异常
try:
    data["weight"]
    print("字典不存在",e)
    print(m[9])
except IndexError as e:
    print(e)
except Exception as e:  #抓住所有的错误;不建议一开始就是用使用
    print("未知错误")
else:
    print("一切正常")
finally:
    print("finally 是有错没错都执行")

自定义异常

rint("-------\n自定义异常")
class mysqlerror(Exception):
    def __init__(self,msg):
        self.msg="23333333"
    def __str__(self):
        return "asdf"
try:
    raise mysqlerror("数据库连不上出错了吧哈哈")  #raise触发自己编写的异常;自定义异常时不要覆盖已有的异常
except mysqlerror as e:
    print(e)
View Code

 

OSI七层

https://www.cnblogs.com/qishui/p/5428938.html

 

 

 

网络协议的基础是socket,socket是对tcp/ip的封装

Socket Families(地址簇)

socket.AF_UNIX unix本机进程间通信 

socket.AF_INET IPV4 

socket.AF_INET6  IPV6

 

ocket 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.SOCK_RDM  #是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。

 

洪水/dos工具原理就是利用socket.raw修改ip头发起攻击的


 第30分钟
posted @ 2019-03-24 22:06  binghex  阅读(161)  评论(0编辑  收藏  举报