面向对象Day09

本文深入讲解了Python面向对象编程的基础概念,包括对象属性与方法、类属性与方法的区别及使用方式,介绍了如何利用__slots__限制对象属性的添加,探讨了私有属性和方法的实现与访问方式,并演示了@property装饰器的应用场景。此外,还涵盖了继承机制、父类方法的调用、以及一些系统内置方法的作用。

回顾文件的操作

这种方式 和之前 的是一样的操作 好处是 不需要 手动去close了 其他的操作都一样

with open("1手动抛出异常.py",'rb') as file:
    print(file.read().decode("UTF-8"))

一 对象属性和类属性

在对象 里 创建的属性 称为 对象属性
在类定义的时候 或者是通过类创建的属性 称为 类属性
区别:
  1. 对象创建的属性 只有当前对象有 其他对象 没有
  2. 在类里创建的属性 所有的对象 都会拥有该属性
  3. 当在对象里创建了一个 和类同名的属性时 在次调用会优先调用对象的属性
  4. 对象不能够删除类属性
例子:
class A:
    name = ""  #类属性
    def setAge(self):
        self.age = 18  #对象属性 因为通过当前的对象来创建的

a = A() #实例化 类A
a.name = "" #这个是对象属性  通过当前对象 a来创建的

#创建类属性
A.属性名 = 属性值

#删除类属性
del A.属性名

#删除对象属性
del a.属性名

二 对象方法和类方法

(1) 给对象绑定方法(只有当前对象拥有该方法)
a = A()
from types import MethodType   #通过MethodType来绑定对象方法
a.speak = MethodType(speak,a)
(2) 给类绑定方法 (所有的对象都拥有该方法)
类名.属性名 = 函数名
#所有的对象 都会拥有该方法

三 __slots__ 限制对象属性的添加

#限制对象只能添加 这三个属性
__slots__ = ('name','age','sex')

四 私有属性或方法

(1) 私有属性

__private_attr:俩个下划线作为开头 ,声明该属性为私有属性 不能再类的外部调用或者直接访问 在类的内部调用 self.__private_attr

在类的外部的私有属性的访问:(特殊的访问 不建议 了解)

类名._类名__属性名

(2) 私有方法

__private_func():俩个下划线作为开头 ,声明该属性为私有属性 不能再类的外部调用或者直接访问 在类的内部调用 self.__private_func()

在类的外部的私有方法的访问:(特殊的访问 不建议 了解)

类名._类名__方法名

五 @property装饰器

使用:

​ 在 获取私有属性的方法上 加 @property

​ 在设置值的函数上面 @函数名.setter 为设置值 当你给当前的私有属性名赋值的时候 会自动调用该方法

class A:
    __birth = ''
    year = 2017
    # 写一个 方法 传入现在的年份 来求你的年龄
    @property
    def birth(self):
        return self.year - self.__birth

    #写一个 传入 出生年份的方法
    @birth.setter
    def birth(self,year):
        # self.__birth = year
        try:
            self.__birth = int(year)
        except:
            raise TypeError("请输入正确的年份")
a = A()
a.birth = 100 #设置值
print(a.birth)#获取值
如果没有这个装饰器的话 在类的外部去操作 私有属性 只能通过公有的方法 来调用 但是你操作的是属性 就变成了操作 方法 很明显 不符合操作的逻辑 那么 通过装饰器就可以改变这个问题 在类的外部调用和私有属性同名的方法时 就可以像调用正常的属性一样去调用 但是其实你调用的还是一个方法 不光改变了调用私有属性的操作 还给当前的属性 多了一层过滤的操作

六 单一继承

在 面向对象中(OOP) 当我们定义一个类class的时候 可以从某个现有的类去继承 新的类称为子类 被继承的类 称为父类 ,超类或者基类
所有的类 都会默认继承 超类 (OBJECT) 类
主体结构:
class 类名(父类类名):
    pass

class A(object):
    pass

七 多继承

一个子类继承多个父类

注意:
  1. 注意父类的顺序 如果在调用的时候 没有指定 调用 哪个父类的方法时 会自动从左面的类-右侧 依次搜索
  2. 当多个父类 没有重复的方法或者属性的时候 会全部继承
主体结构:
class C(A,B):
    pass

八 父类的方法的调用

  1. 类名.方法名(self)

  2. super().方法名() 默认调用最近的父类的方法

  3. super(类名,self).方法名() 如果类名传入的是 当前子类的名 那么传不传都一样

如果继承了A,B俩个类

class C(B,A):
    def one_speak(self):
        #类名.方法名(self)
        B.speak(self) #调用 B类里面的speak方法

    def two_speak(self):
        #super().speak() 就近来调用
        super(C,self).speak() #和上面一样
        print("我是新添加的代码")

    def three_speak(self):
        super(B,self).speak() #调用A类里面的speak方法

九 系统方法

(1) 构造方法

__init__([参数1[,参数2]])

说明:在实例化类的时候 自动调用 常用于类的初始化

(2) 析构方法

__del__

说明:在当前文件执行完毕 自动调用 常用于释放资源

也可以通过 del 去触发

(3) 运算符重载

__add__

说明:当对象在进行运算的时候 会被触发

class ADD:
    def __init__(self,x,y):
        self.x = x
        self.y = y
    #当 俩个对象 进行相加的运算的时候 会自动触发
    def __add__(self,other):
        print("调用我了")
        return self.x+other.x
obj1 = ADD(1,2)
obj2 = ADD(1,2)
(4) __str__

说明:在打印当前对象会自动调用

(5) __getattr__

说明:当调用不存在属性时 会被触发

十 系统常用的属性

__doc__ 类的说明

__name__ 类的名称

__bases__ 获取多个父类

__base__ 获取父类

__dict__ 获取当前类/对象的属性或者方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值