#18python中的面向对象

一、类和对象的定义

类就是拥有相同属性和相同功能的对象的集合(抽象)
对象就是类的实例(具体)

二、定义类和对象的语法
2.1 定义类
语法:
class 类名:
    类的说明文档
    类的内容(包含属性和方法)
    
说明:
class        关键字
类名          程序员自己命名
               要求:标识符,不能是关键字
               规范:驼峰式命名,并且首字母大写;见名知义;不适用系统的函数名、类名、模块名
类的说明文档     用""""""引起来的说明性文字,主要说清楚类提供了哪些属性和哪些功能
类的内容        主要包含属性和方法(定义在类中的函数叫方法)

2.2 定义对象(又叫创建对象)
语法:
对象1=类名()

说明:
类名     是已经定义好的类的类名
三、方法

类中的方法分为三种:对像方法、类方法、静态方法

1)对象方法
怎么定义:直接定义在类中函数就是对象方法
特点:自带参数self(self在通过对象调用的时候不用传参, 系统会自动将当前对象传给self),谁调用指向谁
怎么调用:用对象去调用(对象.方法名())

2)类方法
怎么定义: 定义函数前加装饰器 @classmethod
特点:自带参数cls(cls在通过类调用的时候不用传参,系统会自动将当前类传给cls)
怎么调用:用类调用(.方法名())

3)静态方法
怎么定义: 定义函数前加装饰器 @staticmethod
特点:没有默认参数
怎么调用:用类调用

4)对象方法、类方法和静态方法怎么选:
如果实现函数的功能需要用到对象的属性,就选对象方法
四、init方法以及属性
4.1 init方法
    __init__方法又叫初始化方法,用来在创建对象的是对对象进行初始化操作的。
    当我们通过类创建对象的时候,系统会自动调用__init__方法来对象创建出来的对象进行初始化。
    调用构造方法创建对象的时候需不需要参数,需要几个,看被自动调用的__init__
    
4.2 属性:对象属性和类属性
    对象属性: 对象属性的值会因为对象不同而不一样
    a.定义在init方法中
    b.以 self.属性名 = 值
    c.通过 对象.属性名 的方式使用属性
    
    类属性
    直接定义在类中的变量就是类属性
    类属性的值不会因为对象不同而不一样
    通过 类名.属性名 的方式调用
五、对象属性的增删改查
a.(获取属性的值)
对象.属性                          获取对象指定属性对应的值;属性不存在会报错
getattr(对象, 属性名)              获取对象指定属性对应的值;属性不存在会报错
getattr(对象, 属性名, 默认值)       获取对象指定属性对应的值; 属性不存在不会报错,并且返									回默认值
b.改、增
对象.属性 = 值              当属性不存在就给对象添加属性,属性存在的时候就修改指定属性的值
setattr(对象, 属性名,)   当属性不存在就给对象添加属性,属性存在的时候就修改指定属性的值

c.del 对象.属性    -   删除对象中指定的属性
delattr(对象, 属性名)  - 删除对象中指定的属性
六、内置属性
1. __module__ 
类.__module__      获取定义的模块的模块名

2.__class__
对象.__class__     获取对象对应的类

3.__name__
类.__name__        获取类名

4.__dict__
类.__dict__        将类转换成字典(类的类属性名作为key,类属性的值作为值)
对象.__dict__      将对象转换成字典(对象属性名作为key,属性的值作为值)

5. __doc__
类.__doc__         获取类的说明文档

6.__base__、__bases__
类.__base__        获取当前类的父类
类.__bases__       获取当前类所有的父类

7. __slots__
__slots__可以约束当前类的对象能够拥有哪些对象属性
注意: 如果给类属性__slots__赋值了,那么这个类的对象不能再使用__dict__属性
七、getter 和 setter
7.1 getter和setter的作用
    getter作用:在获取某个属性值之前想要做别的事情,就给这个属性添加getter
    setter作用:在给属性赋值之前想要做别的事情,就给这个属性添加setter
    
7.2 怎么添加getter和setter
    1) getter
    第一步:在需要添加getter的属性名前加_
    第二步:定义getter对应的函数(1.需要@property装饰器 2.函数名就是不带_的属性名 3.函数需要一个返回值)
    第三步:获取属性值的通过: 对象.不带_属性名 (本质就是在调用getter对应的函数,取到属性值就是函数的返回值)

    2) setter
    如果想要给属性添加setter必须先给属性添加getter
    第一步:添加getter
    第二步:定义setter对应的函数 (1.需要 @getter函数名.setter 装饰器 2.函数名就是不带_的属性名 3.需要一个参数不需要返回值,这个参数就是尝试给属性赋的值)
    第三步:给属性赋值:对象.不带_属性名 = 值  (本质就是在调用setter对应的函数)
八、继承
a.什么是继承
让子类直接拥有父类的属性和方法的过程就是继承
父类     被继承者(又叫超类)
子类     继承者

b.怎么继承
class 类名(父类1,父类2,...):
    类的说明文档
    类的内容
    
注意: 默认情况下,定义的类继承自object
    
c.在子类中添加内容
1)在子类中添加类属性和方法
类属性和方法的添加不会因为继承而受到任何影响

2) 添加对象属性
对象属性是怎么被继承:继承的时候因为init方法被继承,间接继承了对象属性
在子类的__init__方法中通过 super()去调用父类的__init__方法

d.类中的方法的调用过程(重要)
通过类或者对象在调用方法的时候,会先看当前类中有没有这个方法,如果有就直接调用自己类中的方法;没有就看父类中有没有定义这个方法,如果父类定义了就调用父类的;父类没有定义,就看父类的父类中有没有定义....以此类推,如果 object 中没有定义才会报错!
九、mro模型
主要基于多继承:
class A:
    def show(self):
        print('A')
class B(A):
    def show(self):
        super().show()
        print('B')
class C(A):
    def show(self):
        super().show()
        print('C')
class D(A):
    def show(self):
        super().show()
        print('D')
class E(B, C):
    def show(self):
        super().show()
        print('E')

class F(C, D):
    def show(self):
        super().show()
        print('F')
class G(F, E):
    def show(self):
        super().show()
        print('G')
g = G()
g.show()
对上面的代码的解释说明:
首先先了解super的用法
	super(, 对象)     获取指定类的父类(对象必须是类的对象; 类默认指向当前类,对象默认是当前类的对象)
    
对于这种题:先画它的mro模型图(mro模型图的步骤如下:以此题为例)
第一步:从下往上找继承关系  G
第二步:对于有多个父类的,父类的顺序从左往右 G F E C D B A
第三步:到着写出结果:A B D C E F G
注意:如果遇到super()括号里面写了别的类和类对象,在写mor模块的时候要找括号里面类的父类,而不是当前类的父类
十、单例模式
作用:创建对象的时候,创建的对象都是同一个

语法:
def Person(*args, **kwargs):
    对象 = Person.__new__()
    对象.__init__(*args, **kwargs)
    return 对象

实例
class Person:
    __obj = None

    def __new__(cls, *args, **kwargs):
        if not cls.__obj:
            cls.__obj = super().__new__(cls)
        return cls.__obj

    def __init__(self):
        print('init:', self)

p1 = Person()
p2 = Person()
p3 = copy(p1)
print(p1 is p2)
print(p1 is p3)

结果:
init: <__main__.Person object at 0x00000141DEF50518>
init: <__main__.Person object at 0x00000141DEF50518>
True
True
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值