面向对象编程1(OOP)

➢Object Oriented Programming(OOP)

➢面向对象编程,是一种编程方式,这种编程方式需要使用“对象”来实现。

对象的特征

  • 世间万物皆对象,某个具体的领域也是由对象组成的,所以问题领域里的概念和实体都可以被抽象为对象。
  • 每个对象都是唯一的(对象的唯一性来自于真实世界的唯一性,如我们常说的世界上不存在两片相同的叶子。)
  • 对象都具有属性和行为(对象的行为就包括具有的功能和具体的实现)
  • 对象具有状态(状态指某个时刻(瞬间)对象的各个属性的取值),对象的某些行为往往会改变对象自身的状态。
  • 对象分为类对象和实例对象两大类(类对象是具有相同属性和行为的实例对象的抽象,类对象讲述的是共性,即是类对象是实例对象的模板,实例对象是由类对象抽象出来的。同一类对象的所有实例对象如果具有相同的属性,那么表明他们的属性含义是相同的,如身高,但状态不一定相同)
面向对象编程的大体步骤

1、抽象出类对象

2、抽象出类对象的属性

3、抽象出类对象的行为(方法)

4、根据类对象创建实例对象

5、通过实例对象访问属性和方法

➢抽象:
class <类名>(object):
    <属性与方法>

其中:
1、类名由一个或多个单词组合而成,每个单词的首字母大写且其余字母全部小写

2、(object)表示该类对象继承自Python内置的类对象object,Python中所有的类对象都继承自一个统一的基类:object。

class Cat(object):
    ############## 猫具有的属性 #############
    def __init__(self,breed,name,age,health):### self是指实例化后的对象,第一个参数都是self
        self.breed = breed   ### 品种
        self.name = name    ###昵称
        self.age = age     ###年龄
        self.health = health  ###健康状况

   ############# 猫具有的行为 ################
  ### 行为(方法)是类中特殊的行为 ##########
    def run(self):
        print("All cat is running")
    def miaomiao(self):
        print("All cat is miaoing")
    def eat(self):
        print("All cat is eating")

➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢➢

  • 为了在创建实例对象后对其进行实例化(例如:给实例对象绑定一些属性),可以在类对象中定义一个名为__init__的特殊方法(以双下划线__ 开头和结尾的方法)。这样,创建实例对象后就会自动调用特殊方法__init__。
  • 如果没有定义特殊方法__init__,或者定义了特殊方法__init__但是没有定义除self之外的形参,那么根据类对象创建实例对象时就不需要传入形参。
  • 如果在类对象中定义了特殊方法__init__,那么对于“类名([实参])”会执行两大步:
    1、创建实例对象
    2、自动调用创建的实例对象的特殊方法__init__(创建的实例对象会作为实参被自动传递给特殊方法__init__的第一个形参self)。

类的方法与函数的区别

方法就是定义在类对象中的函数。方法与函数的区别在于:
1、定义方法时,方法的第一个形参表示调用该方法的实例对象,第一个形参的名称通常是self,也可以是其他名称。
2、调用方法时,系统自动将调用该方法的实例对象作为实参传递給第一个形参,第一个实参会传递給第二个形参,第二个实参会传递給第三个形参,依次类推。

根据类对象创建实例对象的语法格式为:
类名([实参])

cat = Cat('波斯猫','喵喵','2','很好')
print(cat.breed)
print(cat.name)
print(cat.age)
print(cat.health)
cat.run()
cat.miaomiao()
cat.eat()
#############输出###################
波斯猫
喵喵
2
很好
All cat is running
All cat is miaoing
All cat is eating

实例属性

实例属性指的是实例对象所绑定的属性
绑定实例属性(給实例对象绑定属性)的方法(两种):

  • 在类对象的内部(方法中):

    语法格式:self.属性名 = 属性值

    推荐在特殊方法__init__中进行绑定,这样,在创建实例对象后自动调用特殊方法__init__对实例对象进行初始化,从而绑定实例属性,如果在其他方法中进行绑定,可能需要手动调用方法后才能绑定。

  • 在类对象的外部:

    Python是动态语言,所以,在实例对象创建之后,可以对其动态地绑定属性。

    语法格式:实例对象.属性名 = 属性值

    如果指定名称的实例对象已经存在,则是对实例属性进行修改。

访问实例对象的方式有两种:

1、在类对象的内部(方法中)
语法格式:self.属性名
2、在类对象的外部
语法格式:实例对象.属性名

之所以添加前缀"self"或"实例对象",是为了表明实例属性被哪个实例对象所绑定。

class My_class(object):
    def __init__(self):
        self.ia1 = 18 ####在实例对象的内部
    def do_sth1(self):
        print(self.ia1)
    def do_sth2(self):
        print(self.ia2)
    def do_another(self):
        self.ia2 = 66
    def do_sth3(self):
        print(self.ia3)

如果一个方法调用了其他方法,要先实例化那个方法,才能运行

my = My_class()
my.do_sth1()
my.do_sth2()

其输出如下:

18
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-12-4f972677225a> in <module>()
      1 my = My_class()
      2 my.do_sth1()
----> 3 my.do_sth2() ## 如果一个方法调用了其他方法,要先实例化那个方法,才能运行

<ipython-input-11-fe3bd9c4e578> in do_sth2(self)
      5         print(self.ia1)
      6     def do_sth2(self):
----> 7         print(self.ia2)
      8     def do_another(self):
      9         self.ia2 = 66

AttributeError: 'My_class' object has no attribute 'ia2'
my.do_another() ###先绑定实例属性ia2
my.do_sth2()
###输出###
66
my.ia3 = 56  ####在实例对象的外部绑定实例对象
my.do_sth3()
###输出56###

同一类对象的不同实例对象是相互独立的。也就是说,给一个实例对象所绑定的实例属性,对于另外一个实例对象是不起作用的

实例对象 __ dict __

可获得该实例对象所绑定的所有属性及其值的字典

类对象属性

类属型

类属性指的是类对象所绑定的属性。
绑定类属性的方法(两种):

  • 在类对象的内部(方法外)
    语法格式:属性名 = 属性值

  • 在类对象的外部
    Python是动态语言,所以,在类对象创建之后,可以对其动态地绑定属性。

    语法格式:类对象.属性名 = 属性值

    如果指定名称的类对象已经存在,则是对类属性进行修改。

访问类属性的方法有两种:

1、在类对象的内部(方法中)

语法格式:类对象.属性名

2、在类对象的外部

语法格式:类对象.属性名 或:实例对象.属性名

类对象的所有实例对象都有一个指向类对象的指针,所以,类对象的所有实例对象都可以访问类对象。

之所以添加“类对象”,是为了表明类属性被哪个类对象所绑定。


class My_Class1(object):
    ############在类对象内部(方法外)绑定类属性
    ml = 78
    
    def do_soh(self):
        ###########在类对象内部(方法中)访问类属性
        print(My_Class1.ml)
    def do_another(self):
        ###########在类对象内部(方法中)访问类属性
        print(My_Class1.ml2)

#######在类对象的外部绑定类属性
My_Class1.ml2 = 88
print(my3.ml2)
88    ##输出

在类对象外部调用类方法,使得在类对象内部(方法中)访问类属性

my.do_another()
88      ##输出   

访问实例属性和类属性都可以通过“实例对象.属性名”的方式。当通过“实例对象.属性名”的方式访问属性时,会先查找指定的实例对象中有没有指定名称的实例属性,如果没有,再查找对应的类对象中有没有指定名称的类属性。所以,当通过“实例对象.属性名”访问属性时,如果实例属性和类属性同名,则实例对象会屏蔽掉类属性

当通过“实例对象.属性名 = 属性值”的方式绑定属性时,这里的属性值只表示实例属性(因为类属性与实例属性的绑定方式不同)在这里,只会查找指定的实例对象有没有绑定指定名称的实例属性,如果没有则进行绑定,如果已经绑定,则对属性值进行修改。

class Eg(object):
    abc = 18
    s = 123
p = Eg()

####在实例对象p中没有找到名为abc的实例属性,然后在类对象Eg中找到了名为abc地类属性
print(p.abc)
18 ### 输出

###########打印名为abc的类属性
print(Eg.abc)
18 ### 输出
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值