静态方法:只是名义上归类管理,实际在静态方法里访问不了类中的任何属性
通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法
class
Dog(
object
):
def
__init__(
self
,name):
self
.name
=
name
@staticmethod
#把eat方法变为静态方法;实际和类没有关系了
def
eat(
self
):
print
(
"%s is eating"
%
self
.name)
d
=
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
__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__
析构方法,当对象在内存中被释放时,自动触发执行。
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
那么问题来了,类默认是由 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 " % (self.name,food))
def talk(self):
print("what is swiming")
d=Dog("big huang")
choice=input("which methord is useing ")
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("------- 自定义异常") 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)
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头发起攻击的