day 16 内存管理及套接字

一 复习

私有化:命名的时候两个下划线开头(不对外公开)
getter和setter
getter --- 获取属性前想做别的事情
setter --- 想要给属性赋值的时候做别的事情
1)属性名前加一个下划线
2)添加getter
@property
def getter名(self):
    做别的事情
    return 值
3)添加setter
@getter名.setter
def setter名(self,参数):
    做别的事情
    给属性赋值

3.方法:
1)对象方法
怎么声明:直接声明在类中的函数
特点:有默认参数self,不需要传参,指向当前对象
怎么调用:对象调用
什么时候用:实现函数的功能需要对象的属性

2)类方法
怎么声明:声明前加@classmethod
特点:有默认参数cls,不需要传参,指向当前类
怎么调用:类调用
什么时候用:实现函数的功能不需要对象属性的前提下,需要类的字段

3)静态方法
怎么声明:声明前加@staticmethod
特点:没有默认参数
怎么调用:类调用
什么时候用:实现函数功能既不需要类也不需要类的字段

4.继承   ---  让子类直接拥有父类的属性和方法
python支持继承语法,默认的类都是继承object;并支持多继承

1)子类添加内容
字段和方法直接声明
添加对象属性

注意:多继承的时候可以集成多个类的方法和字段,但是只能继承第一个类的属性。


#多继承
class Animal(object):
    def __init__(self):
        self.age = 0
        self.weight = 10

    @staticmethod
    def eat(food):
        print('动物吃%s'% food)

class Fly(object):
    pass

二 类的重载方法

1.所有的运算符都可以重载,只需要定义相应的函数就可以了
例如:

重载加法
  self + other = return 返回值
    def __add__(self, other):
        return self.score + other.score



stu1 = Student('xioa',12,31)
stu2 = Student('xi',13,133)
print(stu1+stu2)
练习:让Student的对象支持乘法运算,运算规则是:
*3
class Student:
    def __init__(self, name, age=10, score=0):
        self.name = name
        self.age = age
        self.score = score

    def __repr__(self):
        return '<'+str(self.__dict__)[1:-1]+'>'

    def __mul__(self, other):
        result = []
        for _ in range(other):
            result.append(self)
        return result




stu3 = Student('张三',10,0)
# print(stu3)

# result = stu3*3
# print(result)

print(stu3.__mul__(3))

三 深拷贝和浅拷贝

要注意引用: from copy import*

注意:一个变量直接给另外变量赋值:直接将地址赋值,赋完之后两个变量指向同一个地址,并且相互影响

  • a.浅拷贝

    • 1)列表或字典的copy方法是浅拷贝,切片也是浅拷贝
    • 2)copy.copy(对象) -- 复制指定的对象,产生一个新的对象
      拷贝原理:将被拷贝的对象复制一份,产生一个新的数据,然后将新的数据地址返回
  • b.深拷贝

    • copy.deepcopy(对象) -- 复制指定的对象产生一个新的对象。如果这个对象中有其他的的对象,子对象也会复制

四 数据的存储

引用:from sys import getrefcount

1.数据的存储(内存的开辟)

python中所有的变量都在栈区间,对象都在堆区间。

  • 声明变量或者给变量赋值,是先在内存中(堆)开辟存储数据,然后将数据地址保存在变量中
  • 但是数字和字符串特殊,如果是用数字或者字符串给变量赋值,他不会直接开辟空间保存数据,
  • 而是先在内存检测这个数据之前是否已经存储过,如果已经存储过就直接用上次保存的数据,
    没有存储才会开辟空间。
2.内存释放
  • 1)引用计数
    python中每个对象都有一个人属性叫引用计数,用来保存当前对象的引用的个数

  • 2)
    python中的垃圾回收机制来判断一个对象是否销毁,就看这个对象的引用基数是否为0,如果为0就销毁。


list1 = [1,2,3]
print(getrefcount(list1))

# 让引用计数增加
list2 = list1
dict1 ={'a':list2}

print(getrefcount(list1))

num = 10
print(getrefcount(num))


# 让引用计数减少
list2 = 0
print(getrefcount(list1))

五 服务器

from socket import *
1,创建套接字对象

  • 1)family --- 设置ip协议类型,AF_INET(ipv4),AF_INET6(ipv6)
  • 2)type -- 设置传输协议类型,SOCK_STREAM(TCP),SOCK_DGRAM(UDP)
server = socket(family = AF_INET,type = SOCK_STREAM)

2.绑定ip地址和端口

bind((ip地址,端口))

ip地址 --- 字符串,服务器对应的ip地址
端口号 --- int,端口号用来区分一台电脑上的不同服务。0-65535,0-1024是著名端口一般不选
同一时间一个端口只能绑定一个服务

addr = ('10.7.185.63',9008)
server .bind(addr)

3.开始监听请求

server.listen(520)
print('开始监听')

4.让服务器保持运行状态
5.接受请求

while True:
    connect,addr = server.accept()
    print('连接成功。。。')
6.接收消息(听别人说)
'''
recv(bufsize)   -- bufsize,设置一次性能接收数据的最大值(单位是字节)
                    返回的是字节
 while True:
        re_date = connect.recv(1024)
        print(re_date.decode(encoding='utf-8'))
7.发送数据(说给别人听)
message = input('请输入:')
        connect.send(message.encode())
8.关闭连接(挂电话)
     connect.close()

from socket import *

六 服务器

1.创建套接字对象
client  = socket()
2.连接服务器
client.connect(('10.7.185.64',8001))
3.发送消息
while True:
    message = input('请输入:')
    client.send(message.encode())
4.接收消息
    re_date = client.recv(1024)
    print(re_date.decode(encoding='utf-8'))

你可能感兴趣的:(day 16 内存管理及套接字)