zoukankan      html  css  js  c++  java
  • python面向对象整理(2)


    一.成员修饰符

    共有成员:
    私有成员:字典(字段或方法)前面有两个下划线__.就表示为私有的
    只有类内部函数才能访问,不能直接访问.即只能通过该类的方法访问该类的私有成员
    子类也不能访问父类的私有字段,只能通过父类的方法访问

    #################################################################

    class Foo:
    __country = "China"

    def __init__(self,name,age):
    self.name = name
    self.__age = age
    def showAge(self):
    return self.__age
    def showCountry(self):
    return Foo.__country

    @staticmethod
    def staticShowCountry():
    return Foo.__country

    foo = Foo("xiaoming",23)
    print(foo.name)

    foo_age = foo.showAge()
    print(foo_age)

    foo_country = foo.staticShowCountry()
    print(foo_country)

    ################################################################

    二.特殊方法

    1.__call__ : 对象名() 就相当于执行类中的__call__方法

    ################################################################
    class Foo:
    def __init__(self):
    print("This is init method")
    def __call__(self, *args, **kwargs):
    print("This is call method")

    foo = Foo() #执行的是__init__方法
    foo() #执行的就是__call__方法
    ################################################################

    2.__int__:执行int(对象)相当与执行对象的__init__方法,并把返回值给对象(很少使用)

    __str__:执行str(对象) 相当于执行对象的__str__方法,并把返回值给对象
    使用最多的场景就是相当于java中的 toString() 方法
    print的时候会执行类的__str__方法,并返回返回值

    __del__:析构方法,对象销毁的时候调用该方法。python

    __dict__ :讲对象中封装的所有内容通过字典的形式返回

    __getitem__ :切片(slice类型)或者索引
    __setitem__
    __delitem__

    __iter__: 如果类中有__iter__方法,那么对象就是可迭代对象
    对象.__iter__()的返回值是一个迭代器
    for 循环遇到迭代器,就执行next()方法


    三. metaclass,类的祖宗

    1.在python中一切事物都是对象
    2. class Foo:
    pass
    obj = Foo()
    #obj是对象,Foo类
    #Foo类也是一个对象,type的对象

    #class类默认继承object类
    Foo = type("Foo",(object,),{'func':"function()"})
    3.类都是type的对象
    "对象"都是以类的对象 类()

    ###############################################################################################
    class MyType(type):

    def __init__(self,*args,**kwargs):
    super(MyType,self).__init__(*args,**kwargs)

    def __call__(self, *args, **kwargs):
    obj = self.__new__(self,*args,**kwargs)
    self.__init__(obj)

    class Foo(object,__metaclass__=MyType): #这是python3.6的写法

    # __metaclass__ = MyType #这是python2.7 的写法
    def __init__(self,name):
    self.name = name
    def __new__(cls, *args, **kwargs):
    return object.__new__(cls,*args,**kwargs)

    obj = Foo()
    #obj = Foo()执行流程详解
    #第一步:python解释器识别Foo类,调用父类MyType的__init__方法,其中self是Foo类
    #第二部:Foo() ,调用父类MyType的__call__方法,其中self是Foo类
    # MyType的__call__方法调用 Foo类的__new__方法,obj接受Foo类__new__方法返回的对象
    #第三部:执行MyTpye的 self.__init__方法,self是Foo类,即调用Foo的__init__方法,完成构造Foo类的对象 obj

    ##################################################################################################

    四.异常处理


    1.标准的异常写法
    #################################################################################
    try:
    int("bAR")
    print("可能出问题的代码快")
    except IndexError as e: #IndexError是Exception的子类,为了日志分析,判断莫一类的错误
    print("IndexError",e)
    except ValueError as e:
    print("ValueError",e)
    except Exception as e : #异常的超类
    print(e)

    else:
    print("没有报错信息才会执行的代码块")
    pass
    finally:
    print("在判断是否有异常之后,一定会执行的代码快")
    ################################################################################

    2.主动触发异常: raise Exception("错误的内容")

    ###########################################
    def db():
    return False

    def index():
    try:
    result = db()
    if not result:
    raise Exception("数据库处理错误") #主动触发错误的语法
    except Exception as e:
    str_error = str(e)
    print(str_error)

    index()
    #############################################

    3.自定义异常
    ############################################
    class OldboyError:

    def __init__(self,message):
    self.message = message
    def __str__(self):
    return self.message


    try:
    raise OldboyError("调用自定义的OldboyError异常")

    except OldboyError as e:
    print(e)
    ##################################################

    4.断言: 语法格式:assert 判断条件

    目的:由于强制用户符合一定的条件,可以捕获,但是一般不捕获

    #################################################
    assert 1==1
    print('assert强制用户满足1==1的条件')

    assert 1==2
    print("assert强制用户满足1==2的条件")

    #################################################


    五.反射

    1: 通过字符串的形式操作对象中的成员

    1.getattr(object,"属性值/方法名") :从object对象中获取 属性值或者方法
    2.hasattr(object,"属性值/方法名") :判断object对象 是否有 指定的属性值或者方法
    3.setattr(object,"属性值/方法名","value设定的值") :设定object的 属性值为 value
    4.delattr(object,"属性值") :删除对象中的属性值

    ###############################################
    class Foo:

    def __init__(self,name,age):
    self.name = name
    self.age = age
    def show(self):
    print("%s-%s" % (self.name,self.age))

    foo = Foo("xiaoming",12)

    name = getattr(foo,"name")
    print(name)

    print(hasattr(foo,"age"))

    setattr(foo,"gendar","nan")
    print(hasattr(foo,"gendar"))

    #############################################

    2.小实例

    ##########################################
    s2.py
    __________________________________________
    def f1():
    return "首页"

    def f2():
    return "新闻"

    def f3():
    return "精华"

    #########################################

    s1.py
    _________________________________________

    import s2

    while True:
    inp = input("请输入一个值:")

    if hasattr(s2,inp):
    func = getattr(s2,inp)
    result = func()
    print(result)
    else:
    print("获取失败")

    #######################################

    六.设计模式

    1.单例模式:调用修改的都是一个实例对象

    ######################################
    class Foo:

    __v = None

    @classmethod
    def get_instance(cls):
    if cls.__v:
    return cls.__v
    else:
    cls.__v = Foo()
    return cls.__v


    obj1 = Foo.get_instance()
    print(obj1)

    obj2 = Foo.get_instance()
    print(obj2)

    obj3 = Foo.get_instance()
    print(obj3)
    #####################################

  • 相关阅读:
    【目标检测】RCNN算法详解
    自己搭建传统ocr识别项目学习
    015. asp.net实现简易聊天室
    014. asp.net实现记住密码的功能
    013. asp.net统计网站访问人数
    012. asp.net生成验证码图片(汉字示例/字母+数字)
    011. asp.net内置对象
    010. 使用.net框架提供的属性
    001. 使用ssh连接不上centos 6.5的解决方法及其解决中文乱码
    009. C#中的WebBrowser控件的属性、方法及操作演示代码(转)
  • 原文地址:https://www.cnblogs.com/aniuzaixian/p/8043794.html
Copyright © 2011-2022 走看看