python基础 面向对象编程

本文详细介绍了Python的面向对象编程,包括面向对象与面向过程的区别、类和对象的定义、构造函数__init__()、实例属性和方法、类属性和类方法、特殊方法如_del_、_call_以及垃圾回收机制、继承、多态等概念。此外,还讨论了属性的封装、私有化、property装饰器以及设计模式中的工厂模式和单例模式。
摘要由CSDN通过智能技术生成

面向对象编程是将数据和操作数据相关的方法封装到对象中。

面向对象&面向过程

面向过程:关注程序的逻辑流程,是一个执行者思维,适合编写小规模程序,更适合一个人的工作,关键是找动词
面向对象:适合分工协作,每个人造不同的零件最后组装,适合从宏观上把握,从整体上分析整个系统,但是具体到实现部分的微观操作,仍然需要面向过程的思路去处理,关键是找名词

对象的进化

随着编程面临的问题越来越复杂,编程语言本身也在进化,从主要处理简单数据开始,随着数据变多进化"数组";数据类型变复杂,进化成了"结构体";处理数据的方式和逻辑变复杂,进化出了“对象”。

对象:就是将不同类型的数据,方法(即函数)放在一起,就是对象。

类的定义

如果把对象比作一个饼干,那么类就是制造这个饼干的模具,所以对象就有同样的属性。

在这里插入图片描述
在这里插入图片描述
一个典型的类的结构

# 定义类的时候,名字首字母大写
class Student:
    # 定义属性,名字固定,均为__init__
    # self 必须位于第一个参数,而且必须有
    def __init__(self, name, score):
        self.name = name
        self.score = score

    # self 必须位于第一个参数
    def say_score(self):
        print("{0}的分数是:{1}".format(self.name, self.score))


# 类名+括号代表相当于调用的是属性,就是第一个__init__
s1 = Student('Di', 18)
s1.say_score()

运行结果

构造函数__init__()

之前提过一个对象包括id,type 和value ,那么value 细分为属性(attribute)和方法(method)。
__init__方法要点

  1. 名称固定,必须是__init__
  2. 第一个参数固定,必须是:self。self指的是刚刚创建好的实例对象
  3. 构造的目的就是为了初始化对象的实例属性,如下代码就是初始化实例。
def __init__(self, name, score):
        self.name = name
        self.score = score

可以理解为这一步是为了定义参数:把形参加到括号里面,在下面定义参数。

通过类名(参数列表)来调用构造函数
调用后,将创建好的对象返回给相应的变量。
比如 s1 = Studen(‘Di’,18)包括了下列两步:

  1. new() 方法:用于创建对象,但我们一般无需重新定义该方法.
  2. int()方法:初始化创建好的对象。初始化是指给对象里面的属性赋值。

实例属性

在这里插入图片描述
刚开始定义的是 属性,后来的的say_score定义的是方法。

# 定义类的时候,名字首字母大写
class Student:
    # 定义属性,名字固定,均为__init__
    # self 必须位于第一个参数,而且必须有
    def __init__(self, name, score):
        self.name = name
        self.score = score

    # self 必须位于第一个参数
    def say_score(self):
        print("{0}的分数是:{1}".format(self.name, self.score))


# 类名+括号代表相当于调用的是属性,就是第一个__init__
s1 = Student('Di', 18)
print(s1.name)
# 调用方法属性
s1.say_score()
# 增加属性:年龄和工资
s1.age = 32
s1.salary = 3000

print(s1.salary)
# 再增加一个对象
s2 = Student('Di1', 30)
print(s2.name)
# 删除对象,里面的属性也会随之消失
del s1
s1.name

运行结果

Di
Traceback (most recent call last):
Di的分数是:18
3000
  File "D:/PycharmProjects/MyTest/Day_7/learn_class.py", line 37, in <module>
Di1
    s1.name
NameError: name 's1' is not defined

实例方法

实例方法是从属于实例对象的方法,实例方法的定义格式如下:
def 方法名(self[形参列表]):
函数体
方法的调用格式如下:
对象.方法名()

要点

  1. 定义实例方法时,第一个参数必须为self。和前面一样,self指当前的实例对象。
  2. 调用实例方法时,不需要也不能给self传参,但是可以增加其他的参数。

还是上面的例子:调用函数的两种写法

s1.say_score()
Student.say_score(s1)

运行结果

Di的分数是:18
Di的分数是:18

函数和方法的区别

  1. 都是用来完成一个功能的语句块,本质一样
  2. 方法调用时,通过对象来调用,方法从属于特定实例对象,普通函数没有这个特点。
  3. 直观上看,方法定义时需要传递self,函数不需要

其他

  1. dir()可以获得所有对象属性
print(dir(s1))

结果

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'say_score', 'score']
  1. obj.__dict__对象的属性字典
print(s1.__dict__)

运行结果

{
   'name': 'Di', 'score': 18}
  1. pass 空:表示还没想好怎么写,那就暂时不写
class Man:
	pass
  1. isinstance(对象,类型) 判断“对象”是不是“指定类型”
# 判断s1是不是Student的实例对象,如果是的话就是True,如果有调用的话那就可以是。
print(isinstance(s1,Student))

总结

  1. 类是一个对象,这个对象也有自己的固有属性,但是在值那里面还分为了属性和方法
  2. 定义类的话,要先学会定义属性,然后定义方法,学会如何调用(赋属性,用方法)
  3. 其他是用来判断类的属性等。

类对象

class Student1:
    pass


print(id(Student1))
print(type(Student1))
stu = Student1
stu()
print(id(stu))

运行结果

2377311793064
# 查找这个类的type 指的是这个type的类型是一个模具,是一个饼干类型的
<class 'type'>
# 把Student 赋值给Stu,那么两者的id值是一样的
2377311793064

类属性和类方法

类属性

区别实例方法,实例对象,实例属性,类属性

# 定义类的时候,名字首字母大写
class Student:
    company = 'SXT'  # 类属性
    count = 0  # 类属性

    def __init__(self, name, score):
        self.name = name  # 实例属性
        self.score = score
        Student.count += 1

    # self 必须位于第一个参数
    def say_score(self):  # 实例方法
        print('我的公司是:', Student.company)
        print("{0}的分数是:{1}".format(self.name, self.score))


s1 = Student('Di', 18)  # s1是实例对象,自动调用__init__()方法
s2 = Student('Di1', 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值