Python之面向对象(面向对象思想设计、类和对象、类中的方法和变量的定义和使用)

  • Post author:
  • Post category:python



面向对象的思想设计


  • 面向过程:

在生活案例中:一种看待问题的思维方式,在解决问题的时候,侧重于问题是怎样一步一步解决的,然后亲力亲为的去解决问题

在代码中:代码从上往下依次执行【顺序结构】;各个模块之间的关系尽可能是独立的,当import的时候,加载的顺序也是从上往下


  • 面向对象:

在生活案例中:一种看待问题的思维方式,在解决问题的时候,则重点在于找到一个具有特殊功能的实体或者个体,委托实体或者个体帮忙完成某件事情,这个个体【实体】被称为对象

好处:可以将复杂的问题简单化,将程序员从执行者变成一个指挥者

在代码中:根据不同的需求来执行代码【代码执行顺序不一定】


注意:面向对象只是一个思想,并不是一门编程语言


Python是一门面向对象的编程语言,类和对象是面向对象的核心


类和对象


  • 概念:

类:多个具有特殊功能的个体的集合

对象:在一个类中,一个具有特殊功能的个体,能够帮忙完成某件事情,也被称为实例【instance】

两者之间的关系:类用于描述某一类对象的特征,而对象是类具体的存在


注意:在代码中,一般是先定义类,然后通过类创建对象。类也是一种数据类型(自定义),用法和list,string等相同


  • 类的定义和对象的创建

类的定义:class  类名():

类体

#类的定义【声明】
class MyClass1():
    #类的实现【类体】
    pass

#注意:在同一个py文件中可以同时定义多个类,但是,为了提高代码的可读性,结合模块使用的时候,最好能一个文件中定义一个类
class MyClass2():
    pass

说明:Python中使用class关键字定义类;类名为合法的标识符(遵循大驼峰命名法:单词首字母大写);通过缩进区分类体;类体一般包含两部分内容:对类的特征的描述,对类的行为的描述

对象的创建:变量名=类名()

#对象的创建
my = MyClass1()

  • 类的设计

三要素:事物名称【类名】,举例:人,Person

事物的特征【名词,变量】,举例:姓名,年龄,身高

事物的行为【动词,函数/方法】,举例:吃,跑


类中的方法和变量(定义和使用)

是为了描述类的行为和特征。类中的方法【函数】被称为成员方法。类中定义的变量被称为成员变量,也被称为属性。

  • 定义:
#1.事物的名称:类名
class Person():
    #2.事物的特征:成员变量/属性
    name = ""
    age = 0
    height = 0.0

    #3.事物的行为:成员方法
    #注意:类中的成员方法区别于普通方法;形参部分一定包含self,而且self最好出现在形参列表的第一个
    #调用函数的时候,self不需要被传参
    #除此之外,成员方法和普通方法的使用完全相同,也设置默认参数,关键字参数或者不定长参数

    #self:自己,代表的是类的实例【对象】,self在此处可以是任意的标识符,习惯上使用self
    def eat(self):
        print("eating")

    def run(self):
        print("runnning")
  • 使用
  1. 内存中的对象:per = Person()    #per实际上是一个变量名,存储于栈空间中,它指向了真正的对象,而真正的对象存储于堆空间中
  2. 动态绑定属性和限制属性:Python是一门动态的语言,程序在运行的过程中,可以给对象动态绑定属性
#属性的动态绑定
#1.Python中可以给一个对象动态添加属性【竖向随着对象的出现而出现】
class MyClass():
    num1 = 0
    num2 = 10

    def fun1(self):
        print("fun1")
    def fun2(self,num):
        print("fun2,",num)

my = MyClass()
my.num1 = 11
my.num2 = 22
print(my.num1,my.num2)      #11 22

my.fun1()               #fun1
my.fun2(30)               #fun2, 30

my.num3 = 33        #Python中可以给一个对象动态的添加属性,注意:动态添加的属性只能当前对象拥有,其他的对象无法使用
print(my.num3)        #33

my1 = MyClass()    #属性报错AttributeError: 'MyClass' object has no attribute 'num3'
print(my1.num3)  
#限制属性:正因为能够动态绑定属性而且动态添加的属性是没有限制的,为了避免这个问题,使用__slots__
#__slots__变量:限制一个类中成员变量的个数
#语法:__slots__ = ("属性1","属性2"。。。)
class Test():
    __slots__ = ("num1","num2")
    
t1 = Test()
t1.num1 = 40
print(t1.num1)   #40
t1.num3 = 30     #AttributeError: 'Test' object has no attribute 'num3'
#1.事物的名称:类名
class Person():
    #2.事物的特征:成员变量/属性
    name = "未知"
    age = 0
    height = 0.0

    #3.事物的行为:成员方法
    #注意:类中的成员方法区别于普通方法;形参部分一定包含self,而且self最好出现在形参列表的第一个
    #调用函数的时候,self不需要被传参
    #除此之外,成员方法和普通方法的使用完全相同,也设置默认参数,关键字参数或者不定长参数

    #self:自己,代表的是类的实例【对象】,self在此处可以是任意的标识符,习惯上使用self
    def eat(self,food):
        print("吃"+food)
        print("self地址:",id(self))     #self地址: 2918416580792

    def run(self):
        print("runnning",self.name)


#类中成员方法和成员变量的使用【被访问】
#1.创建对象
#注意:通过类可以创建多个对象,不同的对象在内存中开辟了不同的空间
p1 = Person()
p2 = Person()
print(id(p1) == id(p2))     #False

a = 10
b = 10
#p1和p2是变量名,称为对象,引用,指向了真正的实体【对象】

#2.访问成员变量
#语法:获取值:对象.属性名     重新赋值:对象.属性名 = 新值
per = Person()    #per实际上是一个变量名,存储于栈空间中,它指向了真正的对象,而真正的对象存储于堆空间中
print(per.name)         #获取值
per.name = "李四"       #重新赋值
print(per.name)


#3.调用成员方法
#语法:对象.函数名(实参列表)
#注意:self是系统自动传参的,哪个对象调用了成员方法,则self代表的就是该对象【self表示当前对象】
per.eat("苹果")
print("per地址:",id(per))   #per地址: 2918416580792, 与self地址相同, self地址随着传参改变


per1 = Person()
per2 = Person()
print(id(p1) == id(p2))     #False
print(id(per1.name) == id(per2.name))      #True
#结论:类中的成员变量和成员方法随着对象的出现而出现

per1.run()              #runnning 未知
per1.name = "abc"
per1.run()              #runnning abc



版权声明:本文为qq_38358499原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。