面向对象

什么是类,什么是对象

类是具有相同属性和功能的一类事物

类的结构分两大部分:静态变量,动态方法。如果要查看类中所有内容:__dict方法

对象是类的具体表现

实例化对象的过程

首先在内存中开辟一块空间,自动执行init方法将实例化的对象地址传入self参数中,在init方法中通过self给对象空间添加属性(实例变量)

一:我们定义的类的属性到底存到哪里了?有两种方式查看
dir(类名):查出的是一个名字列表
类名.dict:查出的是一个字典,key为属性名,value为属性值

二:特殊的类属性
类名.name# 类的名字(字符串)
类名.doc# 类的文档字符串
类名.base# 类的第一个父类(在讲继承时会讲)
类名.bases# 类所有父类构成的元组(在讲继承时会讲)
类名.dict# 类的字典属性
类名.module# 类定义所在的模块
类名.class# 实例对应的类(仅新式类中)

类属性的补充

image-20250220214803408

类变量:所有实例都共享这个变量

class Person:
    # 类变量,所有实例对象都共享这个变量
    country = '中国'

    # 方法
    def __init__(self, name, age):
        # 属性
        self.name = name
        self.age = age

    # 方法
    def say(self):
        print('我是{self.name},我今年{self.age}岁!'.format(self=self))


p3 = Person('王五', 3000)
p3.country = '大秦'
print(p3.name)  # 王五
print(p3.country)  # 大秦

p4 = Person('赵六', 30)

print(p4.name)  # 赵六
print(p4.country)  # 中国

p3.country = '大秦'的时候,并没有去改变类中的country,而是给自己添加了一个实例属性,这个属性只有在p3这个实例对象中才是存在的,在p4中是不存在的。

总结

类变量,是定义在类中的变量,该类的实例对象都可以访问到该变量,但是实例对象只能查看不能修改。想要修改类变量,只能通过类名来修改。

实例变量,给实例对象用的。

类变量,实例对象共享的。

类中的方法分为实例方法、静态方法和类方法。

实例方法是我们接触和使用最多的,实例对象可以直接访问的方法就叫实例方法(成员方法)

class Computer:
    # 实例方法
    def play(self):
        print('我的电脑可以玩游戏')
c1 = Computer()
c1.play()  # 实例对象直接调用实例方法

静态方法

静态方法不需要传递“self”参数,也就是说,当类中的方法不需要传入实例变量的时候,就可以使用静态方法。

定义静态方法时需要我们在该方法上添加@static,示例如下:

class Computer:

    # 实例方法
    def play(self):
        print('我的电脑可以玩游戏')

    @staticmethod
    def fire():
        # 方法不需要传入实例对象变量
        print('我的电脑非常牛B,可以煎鸡蛋')


c1 = Computer()
c1.play()  # 实例对象直接调用实例方法
c1.fire()

静态方法和静态变量一样,都可以使用类名直接访问。

类方法

类方法是由类调用的方法,他的第一个参数必须是类本身。类方法在被调用的时候,不需要调用者传递该参数,不需要创建实例,解释器会自动的把类当成第一个参数,类方法在定义的时候需要在类方法上添加@classmethod。通过类名或实例名调用

class Computer:

    # 实例方法
    def play(self):
        print('我的电脑可以玩游戏')
    @staticmethod
    def fire():
        # 方法不需要传入实例对象变量
        print('我的电脑非常牛B,可以煎鸡蛋')
    @classmethod
    def calc(ojb, a, b):
        print(ojb)
        return a + b
c1 = Computer()
c1.play()  # 实例对象直接调用实例方法
c1.fire()
ret = Computer.calc(10, 20)  # <class '__main__.Computer'>
print(ret)  # 30

属性方法

属性方法其实就是把类中的方法改造成属性的一种写法,该写法需要在方法上加上@property,详细看python之路周末班:Python基础之面向对象基础 - Q1mi - 博客园

优点就是这个属性是动态的,不是写死的,例如年纪

私有成员

在某些场景下,我们可能会在类中存储一些只有我们自己能访问的信息。在Python中我们可以使用两个连续的双下划线将属性或方法变为私有的。

私有变量

私有方法

这些被双下划线开头的属性或方法都只能在类的内部调用,不能继承

命名空间

调用习惯

组合

什么情况下比较适合用组合

继承

单继承

继承什么时候用

当存在A has B 时用继承,但尽量用组合去替代继承

单继承的调用顺序:优先从本类中寻找,没有的话,再从父类中寻找。

如果同时调用子类和父类方法,优先从子类中调用,然后手动的调用父类方法

多继承

object是所有类的父类

什么是函数,什么是方法

用类名调用类里面的函数就叫函数

用对象名调用类里面的函数就叫方法

from types import FunctionType,MethodType
class A(object):
    def func(self):print('in A')
print(isinstance(A.func,FunctionType))#True
a=A()
print(isinstance(a.func,MethodType))#True

多继承的继承顺序

image-20250221214846016

背诵

python3所有类都继承object类

只要继承object类就是新式类

经典类在python3中不存在,在python2中不主动继承object类

通过继承实现类的开发规范

多态

python中一切皆对象,处处是多态

posted @ 2025-03-11 18:37  Randy_xun  阅读(15)  评论(0)    收藏  举报