zoukankan      html  css  js  c++  java
  • python 之路8 面向对象2

    一。 面向对象三大特性:
    多态
    多种类型 参数可以是python的任意一种类型

    def func(arg)
    print(arg)

    obj = func(int)
    obj = func(str)
    obj = func(dict)
    封装
    继承

    二。面向对象中 成员
    字段
    class Foo:
    #字段(静态字段) 存放在类里面 静态字段减少内存使用,多个对象公用一份
    CC = 123

    def _init__(self):
    #name字段 为普通字段 存放在对象里面
    self.name = 'wyx'



    class Provice:
    country = '中国'

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

    #一般情况下:自己访问自己的字段
    hn = Provice('河南')
    hb = Provice('河北')

    hn.name 只可以访问自己的name字段
    hb.name 只可以访问自己的name字段

    #规则:
    普通字段只能对象去访问
    静态字段用类访问(万不得以的时候可以使用可以用对象去访问)
    PS:静态字段代码加载的时候,已经创建


    方法
    所有地方法属于类
    1.普通方法:至少有一个self,对象执行
    2.静态方法:任意参数, 类执行
    3.类方法 :至少一个cls, 类执行


    class Provice:
    country = '中国'

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

    def show(self):
    print(self.name)

    #普通方法,由对象去调用执行(方法属于类)
    obj = Provice('河南')
    obj.show()

    #静态方法,由类去调用执行(方法属于类),静态方法可以没有参数或者有多个参数
    @staticmethod
    def f1(arg):
    print(arg)

    Provice.f1(1111111)


    #类方法:静态方法的特殊方式,类方法至少有一个参数cls,cls自动传值
    @classmethod
    def f2(cls):
    #cls为类名, cls()为创建对象
    print(cls)

    Provice.f2() #会输出类名



    属性 对象调用执行
    不伦不类的东西
    具有方法的写作形式,具有字段的访问形式

    class Pager:
    def __init__(self,all_account):
    self.all_account = all_account

    @property #设置成具有字段属性的类型
    def all_pager(self):
    a1,a2 = divmod(self.all_account,10)
    if a2 == 0:
    return a1
    else:
    return a1 + 1

    p = Pager(101)
    ret = p.all_pager
    #属性可以不用括号来调用
    print(ret)



    @all_pager.setter #设置成可以传参数的属性
    def all_pager(self,value):
    a1,a2 = divmod(value,10)
    if a2 == 0:
    return a1
    else:
    return a1 + 1
    p = Pager
    p.all_pager = 1111


    @all_pager.deleter #设置成可以删除的属性 (del all_pager)
    def all_pager(self):
    del Pager.all_pagerggg

    p = Pager
    del p.all_pager



    class Pager:
    def __init__(self,all_account):
    self.all_account = all_account

    def f1(self):
    return 123
    def f2(self,value):
    print(value)

    def f3(self):
    pass

    foo = property(f1,f2,f3)

    p = Pager(101)
    #print(p.foo)
    p.foo = 456
    print(p.foo)
    del p.foo





    三。成员修饰符
    公有:
    class Foo:
    def __init__(self,name):
    self.name = name

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

    obj = Foo('wyx')
    print(obj.name)
    obj.f1() #在类的内部和外部均可以调用为公共的

    私有:
    如果想要从外部访问私有的: _Foo__cc

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

    __cc = '123'


    def f1(self):
    print(Foo.__cc)

    obj = Foo('123')
    print(obj._Foo__cc)


    只能类自己本身内部成员可以访问
    class Foo:
    def __init__(self,name):
    self.__name = name

    __cc = '123'


    def f1(self):
    print(Foo.__cc)

    obj = Foo('123')
    obj.f1()


    四。特殊成员

    class Foo:
    #构造方法
    def __init__(self,name,age):
    self.name = name
    self.age = age

    #析构方法
    def __del__(self):
    pass

    def __call___(self):
    print('hahaha 调用我呀')

    def __str__(self):
    return '%s - %d' % (self.name,self.age)

    # obj = Foo()
    # obj() #__call__方法 对象后面加括号

    obj1 = Foo('alex',99)
    obj2 = Foo('wyx',18)
    ret = obj1
    print(ret) #__str__ print 对象名字调用__str__方法

    __dict__ #获取对象中封装的数据
    ret = obj1.__dict__
    print(ret)

    def __getitem__(self, item):
    print(item)

    def __setitem__(self, key, value):
    print('set key value')

    def __delitem__(self, key):
    print('del key')

    obj = Foo()
    #以jian
    obj['k1'] #使用中括号调用__getitem__
    obj['k1'] = 1 #__setitem__调用方法
    del obj['k1'] #__delitem__ 调用方法

    class Foo:

    def __getitem__(self, item): #item为slince 类型 里面包括 起始,终止,步长 如果为切片方式访问
    print(item.start)
    print(item.stop)
    print(item.step)

    def __setitem__(self, key, value): #其中key为slince类型 value为list类型
    print('set key value')
    print(key.start)
    print(key.stop)
    print(key.step)

    def __delitem__(self, key): #其中key为slince类型
    print('del key')
    print(key.start)
    print(key.stop)
    print(key.step)

    obj = Foo()
    obj[1:4:2] #自动执行__getitem__ [1:4:2]为item
    obj[1:4:2] = [11,23,43,4554,33] #其中[1,,4,2] 为key 后面的列表为value
    del obj[1:4] #其中[1,4] 为key


    class Foo: #__iter__ 可以被for循环
    def __iter__(self):
    yield 1
    yield 2

    obj = Foo()
    for item in obj:
    print(item)

    五。对象对象其他
    - isinstance
    对象是不是由这个类创建的

    - issubclass
    一个类是不是另一个类的子类 issubclass(bar,foo) bar是不是foo的子类

    class c1:
    def f1(self):
    print('c1.f1')
    return 123

    class c2(c1):
    def f1(self):
    ret = super(c2,self).f1()
    print('c2.f2')
    return ret


    obj = c2()
    obj.f1() #使用super方法,c2找到自己父类c1的f1方法和self.f1自己的方法,输出c1和c2的f1方法


    - 应用:
    自定义类型,对字典进行补充,有序字典
    class Mydic(dict):
    def __init__(self):
    self.li = []
    super(Mydic,self).__init__()

    def __setitem__(self, key, value):
    self.li.append(key)
    super(Mydic,self).__setitem__(key,value)

    def __str__(self):
    tem_list = []
    for key in self.li:
    value = self.get(key)
    tem_list.append('%s:%s' % (key,value,))
    temp_str = '{' + ','.join(tem_list)+'}'
    return temp_str

    obj = Mydic()
    obj['k1'] = 123
    obj['k2'] = 456
    print(obj)


    六。异常处理


    七。设计模式之单例模式,创建方法
    类方法

    class Foo:
    instance = None

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

    @classmethod
    def get_instance(cls):
    if cls.instance:
    return cls.instance
    else:
    obj = cls('wyx')
    cls.instance = obj
    return obj
    obj1 = Foo.get_instance()
    print(obj1)
    obj2 = Foo.get_instance()
    print(obj2)

  • 相关阅读:
    团队项目-需求分析报告
    团队项目-选题报告
    第一次结对编程作业
    第一次编程作业
    第一次作业
    第10组 Beta冲刺(2/4)
    第10组 Beta冲刺(1/4)
    第10组 Alpha冲刺(4/4)
    第10组 团队Git现场编程实战
    第二次结对编程作业
  • 原文地址:https://www.cnblogs.com/bigjerry/p/5634618.html
Copyright © 2011-2022 走看看