python教程_小白入门2021/2/1
学习目标
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都通用。
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