Python面向对象

内容纲要

一 面向对象

1.编程的方式

  • 面向过程:根据业务逻辑从上到下写垒代码
  • 函数试:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
  • 面向对象:对函数进行分类封装,各种包,让开发“更快更好更强”---目的就是更方便

    2.什么是面向对象

    面向对象就不像面向过程那样按照功能划分模块了,它所关注的是软件系统有哪些参与者,把这些参与者称为对象,找出这些软件系统的参与者也就是对象之后,分析这些对象有哪些特征、哪些行为,以及对象之间的关系,所以说面向对象的开发核心是对象

    3.什么是类

    类是对象的类型,具有相同属性和行为事物的统称。类是抽象的,在使用的时候通常会找到这个类的一个具体存在。

    4.什么是对象

    万物皆对象,对象拥有自己的特征和行为。
    当这个东西不存在的时候就是一个类,当他实例化就是一个对象

    5.类和对象的关系

    类是对象的类型,对象是类的实例。类是抽象的概念,而对象是一个你能够摸得着,看得到的实体。二者相辅相成,谁也离不开谁。(笼统的大多划归为类,具体的算是对象)

    二 定义类

  • 类由三部分组成
  • 类的名称:类名
  • 属性:对象的属性
  • 方法:对象的方法

    '''
    类定义
    class 类名():
        # 类文档说明
        属性
        方法
    '''
    class person():
    '''
        这是一个人类
    '''
    country = '中国'  #声明类属性,并且赋值
    #实例属性通过构造方法来声明
    #self不是关键字,代表的是当前而对象
    def __init__(self,name,age,sex): #构造方法
        #构造方法不需要调用,在实例化的时候自动调用
        # print('我是构造方法,在实例化得时候调用')
        self.name = name  #通过self 创建实例属性,并且赋值
        self.age = age
        self.sex = sex
    
    #创建普通方法
    def getName(self):
        print('我的名字叫:%s,我来自%s'%(self.name,person.country)) #在方法里面使用实例属性
    #实例化对象
    people01 = person('joe',19,'男')  #在实例化的时候传递参数
    #这个people01 就要具有三个属性,并且可以使用getName方法
    people01.getName();

    访问是通过对象明.属性名 访问实列属性(对象属性)

    通过内置的方法访问属性

  • getattr(obj, name[, default]) : 访问对象的属性
  • hasattr(obj,name) : 检查是否存在一个属性
  • setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性
  • delattr(obj, name) : 删除属性
  • 注意:name需要加单引号,obj为实例化对象名称

    内置类属性

  • dict : 类的属性(包含一个字典,由类的属性名:值组成,以字典的形式返回) 实例化类名. dict
  • doc :类的文档字符串 (类名. 查看使用的这是一个什么类)实例化类名. doc
  • name : 类名,实现方式,返回类名 类名. name
  • bases : 类的所有父类构成元素(包含了以个由所有父类组成的元组)

    init ()构造方法和self

  • init ()是一个特殊的方法属于类的专有方法,被称为类的构造函数或初始化方法,方法的前面和后面都有两个下划线
  • 这是为了避免Python默认方法和普通方法发生名称的冲突。每当创建类的实例化对象的时候,init ()方法都会默认被运行。作用就是初始化已实例化后的对象。
  • 在方法定义中,第一个参数self是必不可少的。类的方法和普通的函数的区别就是self,self并不是Python的关键字,你完全可以用其他单词取代他,只是按照惯例和标准的规定,推荐使用self。

    name

  • name :如果是放在Modules模块中,就表示是模块的名字;
    • 如果是放在Classs类中,就表示类的名字;
  • main :模块,xxx.py文件本身.被直接执行时,对应的模块名就是 main
  • 可以在if name == “ main ”:
  • 中添加你自己想要的,用于测试模块,演示模块用法等代码。
  • 作为模块,被别的Python程序导入(import)时,模块名就是本身文件名xxx了。

    三 继承和多态

    在现实生活中,继承一般指的是子女继承父辈的财产。那么在程序中,继承描述的是事物之间的所属关系,例如猫和狗都属于动物,程序中可以描述为猫和狗都继承自动物。同理,波斯猫和家猫都继承自猫。而斑点狗,泰迪都继承之狗。程序中当我们定义一个class的时候,可以从某个现有的class继承,新的class称之为子类(Subclass),而被继承的class称之为基类、父类或超类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。

class Animal():
    def __init__(self,name,food):
        self.name = name
        self.food = food
    def eat(self):
        print('%s爱吃%s'%(self.name,self.food))
#声明一个子类继承animal
class Dog(Animal):
    def __init__(self,name,food,drink):
        #加载弗雷构造方法
        # Animal.__init__(self,name,food,)
        super(Dog, self).__init__(name,food)
        self.drink = drink  #子类自己的属性
    #子类自己的方法
    def drinks(self):
        print('%s爱喝%s'%(self.name,self.drink))
class Cat(Animal):
    def __init__(self,name,food,drink):
        #加载弗雷构造方法
        # Animal.__init__(self,name,food,)
        super(Cat, self).__init__(name,food)
        self.drink = drink  #子类自己的属性
    #子类自己的方法
    def drinks(self):
        print('%s爱喝%s'%(self.name,self.drink))
    #重写父类的eat
    def eat(self):
        print('%s特别爱吃%s'%(self.name,self.food))

dog1 = Dog('金毛','骨头','可乐')
dog1.eat()
dog1.drinks()
cat1 = Cat('波斯猫','秋刀鱼','雪碧')
cat1.eat()
cat1.drinks()

多继承

Python中多继承的语法格式如下:
class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>

需要注意圆括号中父类的顺序,如果继承的父类中有相同的方法名,而在子类中使用时未指定,python将从左至右查找父类中是否包含方法---简而言之就是全面的父类中有就用前面父类的。

多态

多态是在继承的基础下实现的

四 类属性和实例属性

类属性与实例属性

  • 属性
    尽量把需要用户传入的属性作为实例属性,而把同类都一样的属性作为类属性。实例属性在每创造一个类是都会初始化一遍,不同的实例的实例属性可能不同,不同实例的类属性都相同。

    1:实例属性:

init(self,...)中初始化

内部调用时都需要加上self.

外部调用时用“对象名.属性名”调用

2:类属性:

init()里初始化

在内部用classname.类属性名调用

外部既可以用classname.类属性名又可以用instancename.类属性名来调用

3:私有属性:

双下划线__开头:外部不可通过“对象名.属性名”来访问或者更改实际将其转化为了“_类名属性名”(外部无法通过点得方式进行访问,外部需要预留接口(set和get方法)去访问或者修改)
强制访问---实列化对象名.类名
属性名(不要去用)

五 类方法和静态方法

1:普通方法:

def fun_name(self,...):

pass

外部用实例调用

2:静态方法:通过装饰器 @staticmethod 装饰

不能访问实例属性

参数不能传入self

与类相关但是不依赖类与实例的方法

3:类方法:@classmethod

不能访问实例属性

参数必须传入cls

必须传入cls参数(即代表了此类对象-----区别------self代表实例对象),并且用此来调用类属性:cls.类属性名

代码演示

class person():
    '''
        这是一个人类
    '''
    country = '中国'  #声明类属性,并且赋值
    #实例属性通过构造方法来声明
    #self不是关键字,代表的是当前而对象
    def __init__(self,name,age,sex,address,country): #构造方法
        #构造方法不需要调用,在实例化的时候自动调用
        # print('我是构造方法,在实例化得时候调用')
        self.name = name  #通过self 创建实例属性,并且赋值
        self.age = age
        self.sex = sex
        self.__address = address #双下划线开头的属性是私有属性
        person.country = country
    #创建普通方法
    def getName(self):
        #类属性的使用通过类名.属性名使用 这是规范
        #私有属性在类里面使用正常使用
        print('我的名字叫:%s,我来自%s,我住在%s'%(self.name,person.country,self.__address)) #在方法里面使用实例属性

    #创建一个静态方法
    @staticmethod
    def aa():  #不需要传递实例
        #静态方法不能访问实例属性
        #静态方法只能访问类属性
        print('我的名字叫:%s' % person.country)  # 在方法里面使用实例属性

    #类方法
    @classmethod
    def bb(cls,n):  #class  也不是关键字
        #类方法不能访问实例属性
        cls.country = n
        print('我的名字叫:%s' %cls.country )  #就用cls.类属性

#实例化对象
people01 = person('joe',19,'男','上海')

#通过对象来调用静态方
people01.aa()
#通过对象来调用类方法
people01.bb()

#静态方法和类方法的调用,推荐使用类名的方式去调用
#通过类名来调用静态方法
person.aa()
#通过类名来调用类方法
person.bb('usa')
THE END
分享
二维码
< <上一篇
下一篇>>