python之面向对象编程 类的继承


一、面向对象编程

Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数

在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念

面向对象是把整个需求按照特点、功能划分,将这些存在共性的部分封装成类(类实例化后才是对象)

面向对象的三大特性:封装、继承、多态

二、类

1.类的定义使用的关键字是class

2.类的首字母必须是大写

3.目前学习的类都是新式类

4.所有类的基类(祖先)都是object,因此都是需要来继承的

5.在oop的编程中,如果要调用类里面的方法,首先需要对类进行时实例化

   实例化后的对象可以调用类里面的方法

6.数据属性

  • 数据属性可以理解为类里面的全局变量,它是属于类
  • 数据属性可以理解为类里面的局部变量,它是属于对象
  • 类的数据属性是针对所有对象共享的,也就是说针对一个类进行实例化后的对象,调用数据属性,它的内存地址都是一样的

7.当一个方法我们只想获取它的值并且这个方法里面不需要形式参数的时候,那么这个方法我们可以定义成特性方法

 三、类的方法

在Python的类??,在类??编写的特性函数称为?法,这些?法主要分为普通?法,特性?法,静态?法,类?法

普通?法:属于对象也属于类

特性?法:属于对象,编写特性?法的使?需要特别注意,该?法不能有形式参数

静态?法:属于类,使?类名直接调?

类?法 :属于类,使?类名直接可以调?

class Person(object): #对person进行实例化 (object)可写可不写
    #数据属性
    country='中国'
    #init叫构造方法-->初始化类的过程 name,age,sex实例属性
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

    def getName(self):
        '''获取姓名'''
        return self.name

    def setName(self,name):
        '''设置姓名'''
        self.name=name

    def setAge(self,age):
        #设置年龄
        self.age=age

    #普通方法 函数
    def show(self,asd):
        print('my name is {0},and my age is {1},and my sex is {2},and method parms is {3}'.
            format(self.name,self.age,self.sex,asd))

    #特性方法,又可以理解为只读属性,也就是说这个方法只有读的属性,不具有写的属性
    @property
    def getNameAge(self):
        return 'my name is {0},and my age is {1}'.format(self.name,self.age)

    #静态方法,只能使用类名来进行调用
    @staticmethod
    def info(aasd):
        print(aasd)

    #类方法也是只能使用类名来进行调用
    @classmethod
    def info(cls):
        pass


#对类进行实例化的过程,他的对象是obj
obj=Person(name='caiying',age=18,sex='')
print('我想调用实例属性:',obj.getName())
print('我想调用数据属性:',obj.country)
print('我想调用普通方法:')
obj.show(asd='我是方法的形式参数')
print('我想调用特性方法:',obj.getNameAge)

print(obj.country)
obj.setName(name='lisi')
print(obj.getName())

运行如上代码的结果:

我想调用实例属性: caiying
我想调用数据属性: 中国
我想调用普通方法:
my name is caiying,and my age is 18,and my sex is 男,and method parms is 我是方法的形式参数
我想调用特性方法: my name is caiying,and my age is 18
中国
lisi

面向对象登录实战

class login(object):

    def out(self):
        username = input('请输入账户:\n')
        password = input('请输入密码:\n')
        return username,password

    def register(self):
        '''注册账户'''
        username,password=self.out()
        asd=username+' '+password
        with open('user.txt','w') as f:
            f.write(asd)

    def login(self):
        '''登录'''
        username, password = self.out()
        with open('user.txt', 'r') as f:
            lists =f.read().split(' ')
        if username==lists[0] and password==lists[1]:
            print('login success')
        else:
            print('login failed')

if __name__ == '__main__':
    obj=login()
    while True:
        try:
            f=int(input('1、注册 2、登录 3、其他\n'))
        except:
            continue
        else:
            if f==1:
                obj.register()
            elif f==2:
                obj.login()
            elif f==3:
                break

四、类的继承

一个类继承另一个类时,将自动获取另一个类的所有属性和方法

在 Python 中,在继承之前,原先已建立好的类称为基类(Base Class)也叫父类,而经由继承所产生的新类就称为派生类(Derived Class)也叫子类。

子类继承了父类,那么也就是说子类继承了所有的方法__init__()和属性__init__()方法中定义的所有的属性

注意:原则上来说,继承一般不建议超过三代关系

方法重写:当子类的方法与父类的方法名一致的时候,就说子类重写了父类的方法

从上到下:

继承第一原则:
约束条件:从上到下原则是前提是子类没有重写父类的方法
class Father(object):#父类
    country='中国人'
    def __init__(self,xinge):
        self.xinge=xinge

    def show(self):
        print('性格是温和')

class Son(Father):#子类 子类中没有show的方法
    def __init__(self,xinge,hobby):
        self.hobby=hobby
        super().__init__(xinge)
obj=Son(xinge='温和',hobby='读书')
obj.show() #执行的就是父类中show的方法

执行的结果如下:

性格是温和
继承第二原则:
约束条件:从下到上原则是前提是子类重写了父类的方法
class Father(object):#父类
    country='中国人'  #数据属性
    def __init__(self,xinge):
        self.xinge=xinge

    def show(self):
        print('性格是温和')

class Son(Father):#子类
    def __init__(self,xinge,hobby):
        self.hobby=hobby
        super().__init__(xinge)

    def show(self): #子类中重写了show的方法
        print('我的性格:{0},我的爱好:{1}'.format(self.xinge,self.hobby))

obj=Son(xinge='温和',hobby='读书')
obj.show() #执行的就是子类中show的的方法

执行的结果如下;

我的性格:温和,我的爱好:读书

从左到右:

从左到右的原则主要是多继承的(可以继承多个类

class Father(object):
    country='中国人'
    #初始化描述父类的属性
    def __init__(self,xinge):
        self.xinge=xinge
    def show(self):
        print('i am is a father')

class Mother(object):
    def show(self):
        print('i am is a mother')

class Son(Father,Mother): #继承了Father,Mother
def __init__(self,xinge,hobby): 
self.hobby
=hobby super().__init__(xinge)#继承父类的实例属性
obj=Son(xinge='温和',hobby='读书')
obj.show()#子类中没有show的方法,先执行括号左边的Father里面的,如果有不在执行,如果没有,执行右边的Mother里面的

执行的结果如下:

i am is a father