python教程25-self的介绍、slots属性的使用、init魔法方法、eq方法的使用

python教程_小白入门2021/2/1

学习目标
python教程25-self的介绍、slots属性的使用、init魔法方法、eq方法的使用

P 151 self的介绍

对象其实就是对应的内从空间的一块地址
可以这样去理解,将内存空间视为一个大酒店,每一个类对应一种类型的房间,大床房,双人房,三人房等等等。
比如 s1 = Student(“张三”,18)
就是 这么个人,来开了类型为Student的房间,房间号是 s1,登记的开房信息 是 张三,18
那现在警察来了,查房,说我要查s1房间,谁开的房?开房的人多大年龄?
那么就是 s1.name和s1.age就可以查到s1房间的信息了,这样比较好理解

怎么来理解self和理解say_hello这个函数呢,你可以这样想,还是刚才的思路,开Student这种类型房间的用户都享受早餐,你用你的名字去开了Student这种类型的房间,等你早上去吃饭的时候直接报 名字就可以去吃,报的这个名字可以理解为self,这个self 附带着 你的name,age等等信息。在一个类里边,self都通用。
python教程25-self的介绍、slots属性的使用、init魔法方法、eq方法的使用

class Student(object):
    def __init__(self, x, y):
        self.name = x
        self.age = y

    def say_hello(self):
        print("我的名字是{}".format(self.name))


# __init__有个专业的名称叫做  构造方法
# Student("张三",18)  这段代码具体做了什么?
# 1. 调用__new__ 方法,用来申请内存空间
# 2. 调用__init__ 方法,传入参数,将self指向创建好的内存空间,填充数据
# 3. 变量s1也指向创建好的内存空间
s1 = Student('张三', 18)
print(s1.name)  # 张三
s1.say_hello()  # 我的名字是张三

s2 = Student("jack", 99)
s2.say_hello()          # 我的名字是jack

P 152 __slots__属性的使用

class Student(object):
    __slots__ = ('name', 'age')
    # 这个属性定义在类里,不在任何一个函数里,是一个元组,用来规定对象可以存在的属性
    # 说白了就是slots加一个限定,slots元组里有的属性才能用,没有的属性再使用s1.city这种方式加不进来
    def __init__(self, x, y):
        self.name = x
        self.age = y

    def say_hello(self):
        print("我的名字是{}".format(self.name))


# __init__有个专业的名称叫做  构造方法
# Student("张三",18)  这段代码具体做了什么?
# 1. 调用__new__ 方法,用来申请内存空间
# 2. 调用__init__ 方法,传入参数,将self指向创建好的内存空间,填充数据
# 3. 变量s1也指向创建好的内存空间
s1 = Student('张三', 18)
# print(s1.name)  # 张三
# s1.say_hello()  # 我的名字是张三

s2 = Student("jack", 99)
# s2.say_hello()          # 我的名字是jack

# 如果直接使用等号给一个属性赋值
# 如果这个属性以前不存在,会给对象添加一个新的属性
s1.city = "上海"
print(s1.city)      # 上海
# 如果这个属性以前存在,会修改 这个属性对应的值
s1.age = 66
print(s1.age)       # 66

P153 init魔法方法

# 魔法方法,也叫魔术方法,是类里的特殊的一些方法
# 特点:   __(???)__
# 1. 不需要手动调用,会在合适的时机自动调用(可以强制手动调用)
# 2. 这些方法,都是使用__开始__结束
# 3. 方法名都是使用系统规定好的,会在合适的时机自己调用

class Person(object):
    # 在创建对象时,会自动调用这个方法
    def __init__(self, name, age):
        print("init方法被调用了")
        self.name = name
        self.age = age

    def __del__(self):
        # 当一个对象被销毁的时候(程序执行完了之后),会自动调用这个方法
        print("__del__这个方法被调用了")

    def __str__(self):
        return self.name

    def __call__(self, *args, **kwargs):
        # print("call方法被调用了")
        print('args = {},kwargs ={}'.format(args, kwargs))
        gongshi = kwargs['fn']
        return gongshi(args[0],args[1],args[2])


p = Person("张三", 55)  # init方法被调用了
# print(p.age)        # 55
# # __del__这个方法被调用了

# 如果不做任何的修改,直接打印一个对象,打印的是对象的类型以及内存地址
# print(p)    # <__main__.Person object at 0x000001F759966460>

# 当打印一个对象的时候,会调用这个对象的__str__或者__repr__方法
# 如果这两个算法都写了 ,那么只走 str
# print(p)  # 张三

# 如果不重写call方法,直接调用对象名,会报错
#p()     # 'Person' object is not callable,对象不能直接调用

# p()         # __del__这个方法被调用了
# 重写了 call方法,调用对象名就不会报错了

n = p(1, 2, 3,fn=lambda x, y, z: x + y + z)
print(n)        # 6


P 154 eq方法的使用

class Person(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

p1 = Person("zhangsan",22)
p2 = Person("lisi",55)

# p1和p2是同一个对象吗?不是,他们的内存空间不一样,不是同一个对象,但是可以说是p1和p2类型相同
# 怎么比较两个是否是同一对象,比较的是内存地址
print("0x%X" % id(p1))
print("0x%X" % id(p2))
# 0x279A4F66460
# 0x279A6BFF760

# is 身份运算符,可以用来判断两个对象是否是同一个对象
# is 是用来判断地址是否相同的,==本质是调用 __eq__方法,__eq__如果不重写,比较的依然是地址
print(p1 is p2)     # False
print(p1 == p2)     # False

nums1 = [1,2,3]
nums2 = [1,2,3]
print(nums1 is nums2)  # False 不是同一个对象,只是存储的数据相同
print(nums1 == nums2)   # True



上一篇:C语言头文件iso646.h(ciso646)


下一篇:ajax跨域请求jsonp