Mr-shen

面向对象

1、什么是面向对象

面向对象是一门编程思想

面向过程编程思想:

  • 核心是 “过程” 二字,过程指的是解决问题的步骤,即先干什么再干什么!基于该编程思想编写程序,就好比在设计一条工厂流水线,一种机械式的思维方式。
  • 优点: 将复杂的问题流程化,进而简单化
  • 缺点: 牵一发而动全身,程序的可扩展性差

面向对象编程思想:

  • 核心是“对象”二字,对象是 “特征与技能” 的结合体,基于该编程思想编写程序就好比上帝在创造万物,一种上帝式的思维方式。
  • 优点:可扩展性高
  • 缺点:编写程序时复杂程度比面向过程编程高

2、如何产生对象

1、什么是类

类指的是类型,一系列对象之间相同的特征与技能的结合体

在现实世界中,先有对象再定义出类,类是抽象产生的,对象是实际存在的

在程序中,必须先定义类,然后再调用类得到返回值得到对象

2、如何定义类

先从现实世界中通过对象来总结出类,然后再定义类,通过调用类来产生对象

语法:class + 类的名字:(类名要是驼峰体)

​ 对象之间相同的特征(数据属性,变量)

​ 对象之间相同的技能(类中的方法,函数)

3、类的实例化

调用类的过程称为类的实例化,产生的对象也可以称为类的一个实例

调用类产生对象时发生的事情:

  • 产生一个空的对象的名称空间
  • 会自动触发类中的__ init__() , 并将对象当做第一个参数传入
  • 会将调用类括号内的参数,一并传入__ init__()中
# 定义一个People类名,注意使用驼峰体
class People:
    country = \'中国\'

    def __init__(self,name,age,sex):
        # 给对象添加新属性
        self.age = age
        self.name = name
        self.sex = sex

    #类里面定义函数默认会传入一个self当形参
    def learn(self):
        print(\'学习技能\')

p1 = People(\'shen\', 18, \'male\')
print(p1.name) # shen
print(p1.age) # 18
print(p1.sex) # male
#直接通过类来调用类中的函数需要传入任意一个参数给self
People.learn(111)
#通过对象来调用类中的函数,不需要传入参数,因为对象会被当做参数传入
p1.learn()

4、查看类与对象的名称空间 类.__ dict __ 对象.__ dict__

通过类.__ dict __ 或 对象.__ dict__ 查看类与对象的名称空间,也可以通过.__ dict __[\'类或对象中的名字\']直接查看值

# # 定义一个People类名,注意使用驼峰体
class People:
    country = \'中国\'

    def __init__(self,name,age,sex):
        self.age = age
        self.name = name
        self.sex = sex

    #类里面定义函数默认会传入一个self当形参
    def learn(self):
        print(\'学习技能\')

p1 = People(\'shen\', 18, \'male\')
print(p1.__dict__) # {\'age\': 18, \'name\': \'shen\', \'sex\': \'male\'}
print(p1.__dict__[\'age\']) # 18
print(People.__dict__) # {\'__module__\': \'__main__\', \'country\': \'中国\', \'__init__\': <function People.__init__ at 0x000002CCD9AC2B88>, \'learn\': <function People.learn at 0x000002CCD9AC6DC8>, \'__dict__\': <attribute \'__dict__\' of \'People\' objects>, \'__weakref__\': <attribute \'__weakref__\' of \'People\' objects>, \'__doc__\': None}
print(People.__dict__[\'country\']) # 中国
print(People.__dict__[\'learn\']) # <function People.learn at 0x0000015CFB1A6DC8>

5、类或对象的属性操作:增、删、改、查

class People:
    country = \'中国\'

    def __init__(self,name,age,sex):
        self.age = age
        self.name = name
        self.sex = sex

    #类里面定义函数默认会传入一个self当形参
    def learn(self):
        print(\'学习技能\')

p1 = People(\'shen\', 18, \'male\')
# 查
print(p1.country) # 中国
# 改
p1.country = \'China\'
print(p1.country) # China
# 删
del p1.sex
print(p1.sex) # 删除后报错
# 增
People.salary = 150000000000
print(People.salary) # 150000000000
print(p1.salary)# 150000000000

6、类中的数据属性(类中的变量):类中的数据属性是所有对象共享的,对象引用类中的属性,指向的都是类中同一个内存地址

7、类中的方法(函数):类中的方法(函数属性)是绑定给对象使用的,由不同的对象来调用,传入函数中的self不同,内存地址都不一样

p1 = People(\'shen\', 18, \'male\')
p2 = People(\'shen1\', 19, \'male\')
p3 = People(\'shen2\', 20, \'male\')
print(p1.country, id(p1.country)) # 中国 1853896576144
print(p2.country, id(p2.country)) # 中国 1853896576144
print(p3.country, id(p3.country)) # 中国 1853896576144

调用类中的方法,id相同,只是传入的对象给self不同所以方法不同
print(People.learn, id(People.learn)) # <function People.learn at 0x000002A39FF26DC8> 2901786389960
print(p1.learn, id(p1.learn)) #<bound method People.learn of <__main__.People object at 0x00000153E75690C8>> 1459724834120
print(p2.learn, id(p2.learn)) #<bound method People.learn of <__main__.People object at 0x00000153E73BF708>> 1459724834120
print(p3.learn, id(p3.learn)) #<bound method People.learn of <__main__.People object at 0x00000153E73BF588>> 1459724834120

8、对象的绑定方法

由对象来调用类里面的函数称为对象的绑定方法

对象的绑定方法的特殊之处:

  • 会将对象当做一个参数传入
  • 若对象的绑定方法还有其他参数,会一并传入

9、对象属性的查找顺序

对象.属性:先从对象自身的名称空间中查找——》类的名称空间中查找——》再找不到会报错

10、python中一切皆对象

用type方法打印出有 都是类,调用即产生对象,八大数据类型皆是类,定义时自动调用类产生对象,等等

str1 = \'沈\'
print(type(str1))  # <class \'str\'>
list1 = [1, 2, 3]
print(type(list1))  # <class \'list\'>

分类:

技术点:

相关文章: