2018.5.23_Wednesday

"""
面向对象编程的精髓在于"模拟"
"""

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)


 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值