工程师们大家好,配套免费视频(平时上班周末录制)
文章目录
我们虽然做的是计算机软件开发,但是做的系统也不能脱离实际,因为这些系统需要在实际中去运用,才能体现价值,才能挣钱。
超市管理系统,图书管理系统,要是没有这些系统,就需要投入更多的人力,物力去管理,去记录超市商品的价格,图书的分类,以及进销存等等信息,正是因为我们的系统,节约了人力物力,所以才把这份钱投资到了系统上,我们也才有了工资。
那我们就以实际的情况去考虑,比如学生管理系统,学生非常多,有张三,李四,这些人的信息,都是在页面上录入,然后传递到python,python拿到这些信息以后在后台代码中需要传递过去传递过来,为了避免混乱交叉,张三的信息跟李四的信息最好打包独立存放吧?
张三的信息有名字、年龄、性别等等
李四的信息有名字、年龄、性别等等
这些信息在计算机里面统称为数据,也就是我们要存的其实是数据,用什么数据结构去存储呢?
这种数据结构就是类:为了方便存储张三、李四等各种人,类这种数据结构应该要有他们共同的特征,就像印钞一样,为了快速的印出钞票用了一种叫模板的东西,类就是模板,我们提取出张三、李四等学生相似的信息让它成为一个学生模板,后面在输入学生信息的时候,就在这个模板的基础上去创建出一个一个具体学生,这些具体学生在编程语言里,需要依靠类来创建,我们称为对象。
1.1创建类
# 定义了一个类 student 是学生的模板
class student:
def __init__(self, name, age, address):
# 就近原则 self.name = name self.name调用的是self地址里面的name 后面的name就是参数的name
self.name = name # 这个类student 应该具有所有学生共同的名字
self.age = age # 年龄
self.address = address # 地址 这些都是不确定的 所以用变量表示
print(self) # self 等于调用它的对象的地址值 s1调用self就是s1的地址值 s2调用self就是s2的地址值
# 这些提取出来共同的名字、年龄、地址等 称为这个类的属性
# ------------下面是调用上面的类--------------
# 根据张三的信息 调用模板 创建出了一个对象
# s1 就是student模板的一个对象
# student() 调用的 就是student模板的__init__方法 也称为构造方法
# 每创建一个对象在内存中就会分配一个地址
# 而上面的self 就指向调用它的地址 s1.name 那么self=s1的地址值
s1 = student('张三', 20, '成都')
# 比如s1.name是调用的student类里面 name属性 那么这个时候self就代表s1的地址
print(s1.name) # s1.name s1调用self self=s1 self.name是等于张三的 所以这里是张三
print(s1)
# 每创建一个对象 就会生成一个新的地址 每个地址里面都有self
s2 = student('李四', 30, '成都')
print(s2.name) # 这里就是李四
方便理解来个简单内存图(画图画得不好哈哈):
其实对象跟列表什么的一样,也是一种数据结构,也有自己的地址值,不过装的东西比较多(我们会挨着学习),然后依靠模板类创建
class student:
def __init__(self, name, age, address):
print(self) # <__main__.student object at 0x0000022808182F98> 就把self=s1的地址值
self.name = name # 所以self.name='张三' 其实就是改变了地址值里面的name 所以下面能访问到
self.age = age
self.address = address
s1 = student('张三', 10, '成都')
print(s1) # <__main__.student object at 0x0000022808182F98>
print(s1.name) # 上面改了地址里面的东西 大家都同一个地址 所以可以访问
print(type(s1)) # <class '__main__.student'> 指向内存里面的student类
print(id(s1)) # 2370957750168 类似于地址 就是对象在内存的唯一标识
这样还看不懂的话 请看视频(哈哈)
1.2self理解
通过上面其实应该理解了,self就是个变量名,不过是固定的变量名,当有对象被创建时self就会变为对象的地址值,所以
self.name self.age这些代码其实都是在改变对应地址值里面的内容。
self代表当前对象的地址值
1.3变量
class student:
# 写在这里的name属于类变量 也就是属于类的 每个对象共享
name = '张三'
def __init__(self,age):
# 写在这里的age属性实例变量 就是每个实例(对象)私有的
self.age = age # 前面的age是属性 后面的age是参数值
s1 = student(10)
print(s1.name) # 访问的是张三
s2 = student(20)
print(s2.name) # 访问的是张三
# 把name改为李四 因为s1 s2都属于student的实例,会共享name变量,也就是大家访问的是一个
# 所以改变了s2.name s1的name也会跟着改
s2.name='李四'
# 再次访问
print(s1.name) # 张三 发现没变 前面错了吗?
print(s2.name)# 李四
# 没有错 因为字符串是不可变类型
# 假设name属性的地址是0x001
# s1 s2的name都是指向0x001
# 执行s2.name='李四'的时候发现字符串是不可变类型,也就是不会在0x001的基础上
# 去改变 而是从新创建一个字符串对象(字符串也是对象) 地址值0x002
# 所以s2.name--指向了0x002导致 值变为了李四
# 但是s1.name还是指向0x001所以还是张三
# 当然age是每个对象私有的变量 s2改了不会影响到s1
在看下面的例子:
class student:
hobbies = ['篮球', '白球', '大球']
def __init__(self, wifes):
self.wifes = wifes
# 上面有类变量hobbies属于类每个对象共享
# 有私有变量wifes 属于对象私有 都是数组 都是可变类型
s1 = student(['刘亦菲',