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

    面向过程:根据业务逻辑从上到下写垒代码

    面向对象:对函数进行分类和封装

    函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可

    类:用来描述具有相同属性和方法的对象的集合,定义了该集合中每个对象共有的属性和方法。

    方法重写:如果父类继承的方法不能满足子类的需求,可以对父类进行修改

    创建类:

    class 类名:
             成员变量
             成员函数

    例:

    class MyClass:     #定义类
        n1 = 123456
        n2 = 'abc'
        def fun(self):
            return 'hello python!'
    c = MyClass()
    print(c.n1)   #调用MyClass里面的变量n1
    print(c.n2)   #调用MyClass里面的变量n2
    print(c.fun())   #调用MyClass里面的函数fun()

    输出结果:

    123456
    abc
    hello python!

    定义有初始状态的类:类定义了 __init__() 方法的话,类的实例化操作会自动调用 __init__() 方法。__init__() 方法可以有参数,参数通过 __init__() 传递到类的实例化操作上

    def __init__(self): 
        self.data = []

    例:

    class Province:
        a = 123
        def __init__(self,name,capital):
            self.Name = name
            self.Capital = capital
    
    hb = Province('河北','石家庄')
    hn = Province('河南','郑州')
    
    print(hb.Capital)
    print(Province.a)

    输出结果:

    石家庄
    123

    类的使用:

    例1:

    class information:
        name = ''
        age = 0
        weight = 0
        def __init__(self,n,a,w):
            self.name = n
            self.age = a
            self.weight = w
        def result(self):
            print("%s:I'am %s years old now!"%(self.name,self.age))
    
    i = information('pingy',20,130)
    print(i.result())

    输出结果:

    pingy:I'am 20 years old now!

    例2:

    class temp:
        def __init__(self):
            pass
        def __del__(self):   #构建函数,在执行结束后都会执行这条函数
            print('我要释放了!')
        def func(self):
            print('go')
        def __call__(self):
            print('call')
    
    f1 = temp()
    f1.func()  #调用func函数
    f1()   #相当于执行__call__函数,只是跟普通定义的函数调用方式不一样而已

    输出结果:

    go
    call
    我要释放了!

    类的继承:

    例1:普通函数继承&继承函数内容并修改内容

    class father:
        def __init__(self):
            pass
        def func(self):
            print('class father')
        def Bad(self):
            print('抽烟,喝酒')
    
    class son(father):   #继承父类
        def __init__(self):
            pass
        def temp(self):
            print('class son')
        def Bad(self):   #在继承父类后并修改父类
            print('打篮球')
    
    res = son()
    res.temp()   #调用子类中的函数
    res.func()   #调用父类中的函数
    res.Bad()   #修改父类函数的内容

    输出结果:

    class son
    class father
    打篮球

    例2:普通函数继承,保存继承函数内容并增加内容

    class father:
        def __init__(self):
            pass
        def func(self):
            print('class father')
        def Bad(self):
            print('抽烟,喝酒')
    
    class son(father):   #继承父类
        def __init__(self):
            pass
        def temp(self):
            print('class son')
        def Bad(self):
            father.Bad(self)
            print('打牌')  #继承父类中Bad函数,并增加内容
    
    
    res = son()
    res.temp()   #调用子类中的函数
    res.func()   #调用父类中的函数
    res.Bad()   #继承父类中Bad函数,并增加内容

    输出结果:

    class son
    class father
    抽烟,喝酒
    打牌

    例3:构建函数的继承

    新式类继承方法和旧式类继承方法区别:(如下面两个例子:)

    #在2.0版本中:
    >>> class A: def __init__(self): print 'A'.center(10,'*') def save(self): print 'save from A' >>> class B(A): def __init__(self): print 'B'.center(10,'*') >>> class C(A): def __init__(self): print 'C'.center(10,'*') def save(self): print 'save from C' >>> class D(B,C): def __init__(self): print 'D'.center(10,'*') >>> c = D() ****D***** >>> c.save() save from A
    #在3.0版本中:
    class
    A: def __init__(self): print('A'.center(10,'*')) def save(self): print('save from A') class B(A): def __init__(self): print('B'.center(10,'*')) class C(A): def __init__(self): print('C'.center(10,'*')) def save(self): print('save from C') class D(C,B): def __init__(self): print('D'.center(10,'*')) c = D() c.save()

    输出结果:

    ****D*****
    save from C

    例4:旧式类继承方法

    class father:
        def __init__(self):
            print('father.__init__')
    
    class son(father):   #继承父类
        def __init__(self):
            print('son.__init__')
            print('line'.center(30,'*'))
            father.__init__(self)  #调用父类构建函数__init__函数
            
    res = son()

    输出结果:

    son.__init__
    *************line*************
    father.__init__

    例5:新式类继承方法

    #新式类继承方法
    class father(object):
        def __init__(self):
            print('father.__init__')
    
    class son(father):   #继承父类
        def __init__(self):
            print('son.__init__')
            print('line'.center(30,'*'))
            super(son,self).__init__()
    
    res = son()

    输出结果:

    son.__init__
    *************line*************
    father.__init__

    例6:

    class information:    #定义基本属性
        name = ''
        age =0
        weight = 0
    
        def __init__(self,n,a,w):   #定义构造方法
            self.name = n
            self.age = a
            self.weight = w
        def res(self):
            print("%s: I'm %s years old and the weight is %s" %(self.name,self.age,self.weight))
    
    class other(information):    #单继承方法
        grade = ''
        def __init__(self,n,a,w,g):
            information.__init__(self,n,a,w)
            self.grade = g
        def res(self):
            print("%s: I'm %s years old ,The weight is %s kg,grade %s" %(self.name,self.age,self.weight,self.grade))
    
    c = other('telnet',15,45,8)
    print(c.res())

    输出结果:

    telnet: I'm 15 years old ,the weight is 45 kg,grade 8

    多继承:

    class father:   #创建父类
        name = ''
        age = 0
        def __init__(self,n,a):   #定义构造方法
            self.name = n
            self.age = a
        def display(self):
           print("姓名:%s,年龄:%s。" %(self.name,self.age))
    
    result = father('jay1',10)
    print(result.display())
    
    print("我是分割线".center(30,'*'))
    
    class son1(father):   #创建子类1,调用父类
        weight = 0
        def __init__(self,n,a,w):
            self.weight = w
            father.__init__(self,n,a)
        def display(self):
            print("姓名:%s,年龄:%s,体重:%s" %(self.name,self.age,self.weight))
    
    result = son1('jay2',20,50)
    print(result.display())
    
    print("我是分割线".center(30,'+'))
    
    class son2(son1):   #创建子类2,调用子类1
        address = ''
        def __init__(self,n,a,w,add):
            self.address = add
            son1.__init__(self,n,a,w)
        def display(self):
            print("姓名:%s,年龄:%s,体重:%s,地址:%s。" %(self.name,self.age,self.weight,self.address))
    
    result = son2('jay3',30,60,'BeiJing')
    print(result.display())
    
    print("我是分割线".center(30,'-'))
    
    class others:   #创建另外一个类others,没有调用任何类
        job = ''
        def __init__(self,j):
            self.job = j
        def display(self):
            print("工作:%s" %self.job)
    result = others('IT')
    print(result.display())
    
    print("我是分割线".center(30,'='))
    
    class another(son2,others):  #创建另一个类another,调用子类2和others类,多重调用
        email = ''
        def __init__(self,n,a,w,add,j,e):
            self.email = e
            son2.__init__(self,n,a,w,add)
            others.__init__(self,j)
        def display(self):
            print("姓名:%s,年龄:%s,体重:%s,地址:%s,工作:%s,邮件:%s" %(self.name,self.age,self.weight,self.address,self.job,self.email))
    
    result = another('jay4',40,70,'shanghai','HR','123@qq.com')
    print(result.display())

    输出结果:

    姓名:jay1,年龄:10************我是分割线*************
    姓名:jay2,年龄:20,体重:50
    ++++++++++++我是分割线+++++++++++++
    姓名:jay3,年龄:30,体重:60,地址:BeiJing。
    ------------我是分割线-------------
    工作:IT
    ============我是分割线=============
    姓名:jay4,年龄:40,体重:70,地址:shanghai,工作:HR,邮件:123@qq.com

     类的私有方法:

    class Test:
        __secretCount = 0  #私有变量
        publicCount = 0   #公开变量
    
        def counter(self):
            self.__secretCount += 1
            self.publicCount += 1
            print(self.__secretCount)
    
    result = Test()
    print(result.counter())
    print('Line'.center(30,'+'))
    print(result.publicCount)
    print('Line'.center(30,'*'))
    print(result.__secrctCount)

    输出结果:

    1
    +++++++++++++Line+++++++++++++
    1
    *************Line*************
    Traceback (most recent call last):
        print(result.__secrctCount)
    AttributeError: 'Test' object has no attribute '__secrctCount'   #报错,私有变量不能访问。

    类的专有方法:

    class Test:
        name = 'pingy'
        age = 20
        weight = 50
        address = 'BeiJing'
    res = Test()
    
    res.job = 'IT'  #新增一个对象和属性
    1.print(res.job)
    2.print(getattr(res,'weight'))  #查看对象'weight'的属性
    3.print(hasattr(res,'address'))   #查看类中是否存在'address'对象,如果存在返回True,否则返回False
    del Test.address   #删除address对象
    4.print(hasattr(res,'address'))
    5.print(delattr(res,'job'))  #删除job
    6.print(hasattr(res,'job'))  #不存在job对象,del和delattr都是删除对象!
    res.name = 'echo'   #修改name属性
    7.print(res.name)

    输出结果:

    1.IT
    2.50
    3.True
    4.False
    5.None
    6.False
    7.echo

    类的专用方法总结:

    hasattr(res, 'age')    # 如果存在 'age' 属性返回 True。
    getattr(res, 'age')    # 返回 'age' 属性的值
    setattr(res, 'age', 8) # 添加属性 'age' 值为 8
    delattr(res, 'age')    # 删除属性 'age'

    内置类属性:

    __dict__ : 类的属性(包含一个字典,由类的数据属性组成)
    __doc__ :类的文档字符串
    __name__: 类名
    __module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
    __bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)
  • 相关阅读:
    032 Gradle 下载的依赖jar包在哪?
    031 can't rename root module,Android Studio修改项目名称
    030 Cannot resolve symbol'R' 问题解决汇总大全
    029 Android Studio层级显示目录文件
    028 You are about to commit CRLF line separators to the Git repository.It is recommended to set the core. autocrlf Git attribute to true to avoid line separator issues If you choose Fix and Comit ,
    027 【Android基础知识】Android Studio 编译慢及 Adb connection Error:远程主机强迫关闭了一个现有的连接
    026 Android Studio 和Gradle版版本对应关系
    025 Cause: org.jetbrains.plugins.gradle.tooling.util.ModuleComponentIdentifierIm
    024 Android Studio上传项目到Github 最全记录
    023 解决AndroidStudio下载gradle慢的问题
  • 原文地址:https://www.cnblogs.com/ping-y/p/5857226.html
Copyright © 2011-2022 走看看