"""
面向对象编程的精髓在于"模拟"
"""
class Person():
def __init__(self,name,age = 0):
self.name = name
self.age = age
def walk_the_dog(self):
print("%s溜%s"%(self.name,self.dog.name)) #可以用两次句点表示法
p1 = Person(name='xiaoming')
class Dog():
def __init__(self,name):
self.name = name
dog1 = Dog(name='Dahuang')
p1.dog = dog1 #让人拥有狗
#将狗作为人的新属性,定义外添加
#但只是给Person的唯一实例对象添加
p1.walk_the_dog()
print(p1.dog)
"""
创建一个学生类:
属性:姓名,年龄,学号 方法:答到
创建一个班级类:
属性:学生,班级名 方法:添加学生,删除学生,点名
"""
class Student(): ###为什么要设定起始值?其实这里不是起始值,是默认值,在init方法下面声明也是可以的。有默认值在初始化实例对象时即使一部分不传递参数,也会自动填充默认参数。
def __init__(self,name='',age=0,study_id='stu000'): #储存的形式是字典吗?是的 __dict__
self.name = name
self.age = age
self.study_id = study_id
def respond(self):
print('%s,到!'%self.name)
class Class: #设定起始值
def __init__(self,students = [],name = ''):#将students作为Class类的对象属性
self.students = students #Class类创建的实例的"学生们"这一属性
#每个班,容器,储存学生信息
self.name = name #Class实例的班级名
self.__number = 1 #Class实例化的班级的number这一属性
def add_student(self,student):
study_id = 'stu'+self.__make_studyid() #产生学号
self.__number += 1 #实例班级的number属性+=1?
student.study_id = study_id #定义在class Student里,这里的student参数和上面的定义Student类没有关系,更不存在混淆,因为,小写后的student是Student的实例
self.students.append(student) #起始值是个空列表
def __make_studyid(self): #产生学号的方法
num_str = str(self.__number).rjust(4,'0') 定义在类里的函数可以直接调用私有属性,定义在类外面的不能直接调用。
return num_str
唯一一种方式再类外可以调用私有和受保护的属性,就是在类里定义getter和setter
def del_student(self,name):
for student in self.students: #加了self.和没加self.的参数/变量完全不是同一个概念,
# 指向都不一样
if student.name == name:
self.students.remove(student) #remove(self,object) self参数是不用传的,它指向自己,传递的object是要删除的对象
# 在这里student包括了一系列的信息,不光是简单的价值对、字典概念,而是整个对象
break
def call(self):
for student in self.students:
print(student.name + '!')
student.respond()
"""
1.建立一个汽车类Auto,包括轮胎个数,汽车颜色,车身重量,速度等对象属性。
至少要求 汽车能够加速 减速 停车。 再定义一个小汽车类CarAuto
继承Auto 并添加空调、CD等对象属性 覆盖加速 减速的方法 。"""
class Auto():
def __init__(self,wheels=0,color='',weight=0,speed=0):
self.wheels = wheels
self.color = color
self.weight = weight
self._speed = speed
@property #getter,一定要有
def speed(self):
return self._speed
"""
@property,注意英文单词,或许@roperty这一语法就包括了很多内容,改变的内容
这里已经声明了auto(实例).speed = _speed
或许这就是下面不再需要强调_speed的原因
"""
@speed.setter #为什么没有getter就没有setter?而且是speed(后定义的).setter?
def speed(self,speed): #第一个speed是函数名,第二个speed是传的参数
if speed > 150: #受保护是说明这个属性重新增值时有其他的限制,不是设定任何值都符合实际操作
speed = 150
if speed < 0:
speed = 0
self._speed = speed #这里居然还是_speed,难道一旦初始化用的是谁以后self后就跟谁?
#不,这里只是对受保护属性做处理,应该_speed只用这一次
"""
而这里的函数名speed肯定要和@property的speed相呼应的
-->如果,满足所有@setter的条件限制,那么-->就有 self._speed = speed,
重要的是这个流程,重要的是计算机的执行顺序啊~~~
且下面调用的都是auto.speed的了
尝试:self._speed = self.speed
和self._speed = speed 的区别?
除了最后一句话,前面一啪啦都是在介绍和设定speed,那么,这里就有一个模块/&眼界/&划分的问题
是的,句点表示法指向的和.符号前的东西没有任何关系,!!!!!
这就解释通了,自这个设定/声明后,文中再也不见_speed,因为已经被完全替代了
"""
"""
那就不能就单单什么都设定成_speed吗?不是都是一样的吗?
受保护的可以直接访问到吗?-->不可以,所以,getter和setter都是不可免少的
"""
def speed_up(self,increased_value):
self.speed += increased_value
print('当前速度是:%d'%self.speed)
def speed_down(self,down_value):
self.speed -= down_value
print('当前速度是:%d'%self.speed)
def stop(self):
self.speed = 0
print('已经停车')
class CarAuto(Auto):#继承
def __init__(self,wheels):
super().__init__(wheels=wheels) 这里是关键字参数赋值方式,一样的
self.air_conditioning = ''
self.cd = ''
def speed_up(self,up_value):
self.speed += up_value*1.5
print('当前速度:%d'%self.speed)