zoukankan      html  css  js  c++  java
  • 面向对象

    一、复习:
    1、面向过程与面向对象
    过程:程序流程化,可拓展性差
    对象:程序流程多样化,可拓展性强
    面向对象引入属性 | 方法的概念,通过所属者.语法调用
    2、拥有名称空间的对象:有__dict__属性,该属性就是指向对象的名称空间
    文件 | 包(__init__.py文件)| 函数 | 类
    可以为__dict__属性添加值,简化为.语法,也可以对__dict__整体赋值一个字典
    3、类与对象
    类是抽象的,不是真实存在的:具有相同相同特征(属性)和行为(方法)个体的集合的抽象
    对象具象的,是真实存在的:具有特征与行为的实际个体(类的实际体现:实例化)
    4、类与对象的语法:
    class 类名:
    代码块(一堆属性与方法)
    对象名 = 类名()
    5、类会随所属文件加载而加载(执行内部所有代码),形成类的名称空间
    每个实例化出来的对象及类都有自己的名称空间
    类与对象都可以通过.语法来拓展新功能
    提前在类中属性的属性与方法,在对象一产生就可以使用这些属性和方法
    对象查找属性的顺序:先找自身,如果没有找类的(只有访问权没有修改权)
    二、对象的特有名称空间
    __init__方法会在实例化对象时被调用
    1、会为实例化的对象形成空的名称空间
    2、__init__就是一个方法,可以被传参,在类名(实参)这种方式下调用并传参__init__(self,形参)
    3、第一个self就是要产生的当前对象
    重点:在方法内部,形参拿到了实参值,利用self.属性名 = 形参 = 实参值,对对象的名称空间添加属性(即初始化对象的名称空间)
    类中方法第一个默认参数一定是调用该方法的对象
    三、类方法:类中@classmethod修饰的方法
    class Tool:
    @classmethod
    def add(cls,n1,n2):
    cls.text()
    return n1 + n2

    @classmethod
    def text(cls):
    pass
    print(Tool.add(10,20)) #如果不加装饰器,类要调用的话 Tool.add(Tool,10,20)
    print(tool.add(100,200))
    总结:类的名字、对象都可以使用,但是出现了类与对象使用时,参数个数不一致
    对象调用时,外界传入两个参数,内部接受到三个,第一个是对象本身
    所以类方法就是被类与对象调用时,第一个参数一定是类,不建议拿对象来调用
    四、属性与方法的总结
    class OldBoy:
    #属于类的属性
    name = '老男孩'

    #属于对象的属性
    def __init__(self,name):
    self.name

    #属于类的方法
    #需求:获取机构的名字
       @classmethod

    def get_class_name(cls):
    return cls.name

    #属于对象的方法
    #需求:获取校区的名字
    def get_school_name(self):
    return self.name

    #创建校区
    shanghai = OldBoy('上海校区')
    shenzhen = OldBoy('深圳校区')

    #类方法的使用
    print(OldBoy.get_class_name())

    #对象方法的使用(类调用对象方法,必须要把操作的对象手动传入,不建议使用)
    print(shanghai.get_school_name())
    五、封装
    1、类的属性与方法封装
    封装:对外隐藏类中一些属性与方法的实现细节
    优点:外界不能直接访问,让内部的属性与方法具有安全保障
    class A:
    #__开头的属性,在外界不能通过cord | __cord 直接访问,对外隐藏了
    __cord = '01012300'

    #__开头的方法,在外界不能通过 get_money | __get_money 直接访问
    @classmethod
    def __get_money(cls)
    print('输入密码')

    #内部还是还是可以直接访问__开头的属性与方法
    @classmethod
    def test(cls,flag):
    #在调用test与访问具体数据与功能间添加安全处理的操作
    if flag == '自家人' #(安全处理的判断)
    print(__cord)
    cls.__get_money

    A.test('自家人')
    封装的原理:把用__开头的名字更名为_类名__变量名,所以外界也可以直接通过_类名__变量名访问到(不知道的就会以为访问不到)
    2、对象的属性与方法封装
    原理与类的属性与方法封装一样
    class AAA:
    def __init__(self,money):
    self.__money = money
    self.__id = 1000

    @property
    def id(self):
    return self.__id
    @id.setter
    def id(self,id):
    self.__id = id

    对象属性的封装:
    对象的属性值一般都来源于外界,外界是有权利再次访问的
    封装的目的不是让外界无法访问,而是不让其直接访问,可以在完成安全处理后再访问
    如何做到外界还是通过变量名来对属性进行取值赋值,但是走的方法是间接拿到的值
    __money被封装,外界还是可以通过 对象.money 取值赋值
    #取值
    @property #在外界可以 对象.money 进行取值
    def money(self):
    return self.__money
    #赋值
    @money.setter #在外界可以 对象.money = 新值 进行赋值
    def money(self,money):
    return self.__money = money
    #删除
    @money.deleter
    def money(self):
    del self.__money

    def get_money(self,flag):
    if flag == '自家人':
    return self.__money
    return 0

    def set_money(self,money):
    self.__money += money

    a = AAA(88888)
    print(a.__money) #不能访问

    #print(a.get_money('自家人')) #88888
    #a.set_money(100000)
    #print(a.get_money('自家人')) #188888

    print(a.money) #88888
    a.money = 100000
    print(a.money) #100000

    del a.money
    print(a.money)
  • 相关阅读:
    pku2351 Colored Sticks
    JSOI2010 满汉全席
    享元模式
    适配器模式
    合成模式
    原型模式
    创建型设计模式
    建造者模式
    装饰模式
    单例模式
  • 原文地址:https://www.cnblogs.com/yanminggang/p/10730499.html
Copyright © 2011-2022 走看看