• python笔记


                      python笔记 - day8                         

    参考:

    大纲

    面向对象三大特性之多态

    类成员之静态字段和普通字段

    类成员之普通方法和静态方法以及类方法

    类成员之属性

    类成员之成员修饰符

    类成员之特殊成员

    其他之isinstance和issubclass

    其他之super的应用

    实例之自定义有序字典

    单例模式

    基本异常处理

    异常类型

    主动触发异常

    自定义异常和断言

    JAVA和C#不支持多态(几种编程语言多态形式对比)。

    字段:

    普通字段保存在对象里面,静态字段保存在类里面。

    访问普通字段,静态字段规则,方法:
      一般情况,自己访问自己字段
    规则:
      普通字段只能用对象访问
      静态字段用类访问(万不得已可以使用对象访问)

    class Province:
        country = "中国"
        #静态字段
    
        def __init__(self,name):
            self.name = name
            #普通字段
    
    hn = Province("河南")
    hb = Province("河北")
    sd = Province("山东")
    db = Province("黑龙江")
    print(hn.name)


    class Province:
    country = "中国"

    def __init__(self,name):
    self.name = "alex"

    hn = Province("河南")
    print(hn.name)

    #通过类访问静态字段,推荐
    print(Province.country)

    #通过对象访问静态字段,不推荐
    print(hn.country)


    class Provice:
    country = "中国"

    def __init__(self,name):
    self.name = "alex"

    print(Province.country)
    #静态字段,在代码加载时,已经创建;
     
    class Province:
        country = "中国"
    
        def __init__(self,name):
            self.name = name
            #普通方法,由对象去调用执行(方法属于类)
    
        def show(self):
            #print(self.name)
            print(123)
    
        @staticmethod
        def f1(arg1,arg2):
            #静态方法,由类直接调用执行
            print(arg1,arg2)
    
        @classmethod
        def f2(cls):
            cls #类名,加()创建对象
            print(cls)
    
    Province.f1(1,2) #静态方法,由类直接调用执行
    Province.f2()  #不用传值,自动传值
    
    所有方法属于类:
    1.普通方法:至少一个self,    对象执行
    2.静态方法:任意参数,        类来执行(也可以对象执行,不推荐)
    3.类方法:至少一个cls         类执行(也可以对象执行,不推荐)
    分页:不使用属性;

    class
    Pager: def __init__(self,all_count): self.all_count = all_count # @property def all_pager(self): a1,a2 = divmod(self.all_count,10) if a2 == 0: return a1 else: return a1 + 1 p = Pager(101) #不使用人妖,属性 #p.all_count #字段 result = p.all_pager()#方法 print(result)


    使用属性,人妖,@property,:
    使用属性实现的效果功能是
    通过对象执行方法,不用加括号了。
    class Pager:
    def __init__(self,all_count):
    self.all_count = all_count

    @property
    def all_pager(self):
    a1,a2 = divmod(self.all_count,10)
    if a2 == 0:
    return a1
    else:
    return a1 + 1

    @all_pager.setter
    def all_pager(self,value):
    print(value)

    @all_pager.deleter
    def all_pager(self):
    print("del all_pager")

    #通过@property执行方法,不用加括号了;
    p = Pager(101)
    ret = p.all_pager
    print(ret)

    # #给属性重新赋值,加变量
    res = p.all_pager = 111
    print(res)

    # #删除属性
    del p.all_pager

    属性定义:
    1.不伦不类的东西
    2.具有方法的写作形式,具有字段的访问方式;
    3.属性只是提供的是访问方法,具体做什么靠自己定义。

    属性存在的第二种方式:
    class Pager:
    def __init__(self,all_count):
    self.all_count = all_count

    def f1(self):
    return 123

    def f2(self,value):
    print(value)

    def f3(self):
    print("del p.foo")

    foo = property(fget=f1,fset=f2,fdel=f3)

    p = Pager(101)

    result = p.foo
    print(result)

    p.foo = "alex"

    del p.foo
     

    属性一:

    属性二:

    属性存在的第二种方式:

    成员修饰符:
    私有: 只能类自己本身成员内部可以访问
    公有:

    class Foo:
     def __init__(self,name):
         self.__name = name
    
     def f1(self):
         print(self.__name)
    
    class Bar(Foo):
        def f2(self):
            print(self.__name)
    
    obj = Bar("alex")
    # obj.f2()
    obj.f1()
    
    上面这个例子:不能通过f2调用私有方法,只能通过本身f1调用私有方法,结论:私有方法只能通过内部调用;


    class Fzz:
    __cc = "123"

    def __init__(self,name):
    self.__name = name

    def f1(self):
    print(self.__name)

    # def f3(self):
    # print(Fzz.__cc)

    #通过静态字段方法来执行
    @staticmethod
    def f3():
    print(Fzz.__cc)

    # print(Fzz.__cc) #调用不到cc方法

    obj = Fzz('dddd')
    obj.f3()
    #能够调用到cc的方法

    Fzz.f3()
    #通过静态字段方法来执行
     

     内置方法:

    class Foo:
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        def __del__(self):
            pass
    
        def __call__(self, *args, **kwargs):
            print("call")
    
        def __str__(self):
            return "%s - %d"%(self.name,self.age)
    obj = Foo('alex',18)
    obj() #对象,执行call方法
    Foo('alex',18)() #执行类方法并且执行call方法;(这么写) #类加括号执行__init__方法 #对象加括号执行call方法 #这里应用的__str__方法,不用__str__方法,输出的是内存地址 obj1 = Foo('alex',73) obj2 = Foo('eric',84) print(obj1) print(obj2)

     

    class Foo:
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        def __str__(self):
            return "%s - %d"%(self.name,self.age)
    
        def __getitem__(self, item):
            return 123
    
        def __setitem__(self, key, value):
            print("setitem")
    
        def __delitem__(self, key):
            print('del item')
    
    obj1 = Foo('alex',73)
    #获取对象中封装的数据,获取数据类型是字典
    ret = obj1.__dict__
    print(ret,type(ret))
    
    #执行__getitem__
    ret = obj1['test']
    print(ret)
    
    #执行__setitem__
    res = obj1['k1'] = 111
    print(res)
    
    #执行__delitem__
    del obj1['k1']
    class Foo:
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        def __str__(self):
            return "%s - %d"%(self.name,self.age)
    
        def __getitem__(self, item):
            print(type(item))
            print(item.start)
            print(item.stop)
            print(item.step)
            return 123
    
        def __setitem__(self, key, value):
            print(type(key),type(value))
            print(key.start)
            print(key.stop)
            print(key.step)
    
        def __delitem__(self, key):
            print(type(key))
    
    #执行__str__
    obj1 = Foo('alex',73)
    print(obj1)
    
    #执行__getitem__
    ret2 = obj1[1:3:2]
    print(ret2)
    
    #执行__setitem__
    ret3=obj1[1:4] = [11,22,33,44,66]
    print(ret3)
    
    #执行__delitem__
    del obj1[1:4]
    class Foo:
        def __iter__(self):
            yield 1
            yield 2
    obj = Foo()
    for item in obj:
        print(item)
    #原理:把iter的值,返回给obj

    类和类,类和对象之前的关系检测

    class Bar:
        pass
    
    class Foo(Bar):
        pass
    
    obj = Foo()
    ret = isinstance(obj,Foo)
    res = isinstance(obj,Bar)#因为Foo继承了Bar,这里也为true
    print(ret)
    print(res)
    #isinstance:判断这个类,是否属于这个对象
    
    ret1=issubclass(Foo,Bar)
    print(ret1)
    #issubclass:判断Foo是否是Bar的子类;

    super()

    #这个程序执行半天也不行,必须用python3执行
    class C1:
    
        def f1(self):
            print("c1.f1")
    
    class C2(C1):
    
        def f1(self):
            #主动执行父类的f1方法
            super(C2,self).f1()
            print("c2.f1")
    
            #方法二:执行C1的f1,python2也可以(不建议用);
            # C1.f1(self)
    
    obj = C2()  
    obj.f1()

    结果:执行super(C2,self).f1()后,执行print("c2.f1")

    有序字典

    class MyDict(dict):
    
        def __init__(self):
            self.li = []
            super(MyDict,self).__init__()
    
        def __setitem__(self, key, value):
            self.li.append(key)
            super(MyDict,self).__setitem__(key,value)
    
        def __str__(self):
            temp_list = []
            for key in self.li:
                value = self.get(key)
                temp_list.append("'%s':%s"%(key,value,))
            temp_str = "{"+",".join(temp_list) +"}"
            return temp_str
    
    obj = MyDict()
    obj['k1'] = 123
    obj['k2'] = 456
    print(obj)

    设计模式(重要),单例模式,最基础的

    class Foo:
        instance = None
    
        def __init__(self,name):
            self.name = name
    
        @classmethod
        def get_instance(cls):
            #cls是类名
            if cls.instance:
                return cls.instance
            else:
                obj = cls('alex')
                cls.instance = obj
                return obj
    
    obj1 = Foo.get_instance()
    print(obj1)
    obj2 = Foo.get_instance()
    print(obj2)
    #内存地址都是一样的

    主动触发错误:

    try:
        raise ValueError('主动错误一下') #self.message = '主动错误一下'
        print(123)
    
    except ValueError as ex:
        print(ex)  #str
    
    except Exception as ex:
        print(ex)  #__str__,return self.message
    else:
        pass

    异常处理,异常类型:

    while True:
        num1 = input("num1:")
        num2 = input("num2:")
        try:
            li = []
            li[100]
            num1 = int(num1)
            num2 = int(num2)
            result = num1 + num2
        except Exception as ex:
            print(ex)  #输出的类型是str
    
        except ValueError as ex:
            print(ex)
    
        except IndexError as ex:
            print(ex)

     finally(都会执行):

    try:
        li = []
        li[100]
    except IndexError as ex:
        print(ex)  #str
    
    except Exception as ex:
        print(ex)
    else:
        pass
    finally:
        print("上面的条件成立,不成立,都执行finally")

     

  • 相关阅读:
    将数据加载时显示的图片和文字提成公共的--实现方法
    JavaScript【面向对象】-静态方法-私有方法-公有方法-特权方法
    强大的JS数组
    sql工作问题总结
    JSON.stringify()的使用--将string转换成json
    JS小技巧
    JS工作积累
    (六)Redis之数据结构之Set
    (五)Redis之List
    (四)Redis之哈希
  • 原文地址:https://www.cnblogs.com/tangshengwei/p/5930345.html
Copyright © 2020-2023  润新知