编程思想之面向对象

今日学习总结:

注意:编程思想仅仅是一门思想,与任何的技术无关。

         一、面向过程编程思想

                     核心是‘过程’二字,过程指的是解决问题的步骤,即先干什么后干什么。

                     基于该编程思想编写程序,就好比在设计一条工厂流水线,一种机械式的思维方式

                     优点:将复杂的问题流程化,进而简单化。

                     缺点:牵一发而动全身,程序的可扩展性差。

         二、面向对象编程思想:(注意:要将自己当做一个上帝)

                核心是‘对象’二字,对象指的是‘特征与技能’的结合体。

                基于该编程思想编写程序,就好比在创造世界,一种‘上帝式’的思维方式。

                优点:编程可扩展性高 

                缺点:编写程序的复杂程度比面向过程高

          1. 怎样创造对象  :

                     01、什么是类:一系列对象 相同的特征与技能 的结合体。

                             类是指类型、类别。

                            --在现实生活中:先有一个个的对象,经过社会的文明发展,随之总结出类。

                            --在程序中:必须先有类,再通过调用类,产生对象。

                    02、如何写类:

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

            ps:对象指的是‘特征与技能’的结合体,类指的是一系列“对象之间相同的特征”

                    03、如何定义类:定义类名的规范:驼峰体命名法

                            定义语法:(class 关键字:是帮你产生类的

                                              class 类的名字:

                                                       --对象之间相同的特征 :称为属性(attribute)

                                                       --对象之间相同的技能   :称为方法(def  learn)

                     04、定义类的例子:

                    

class OldboyStudent:     #OldboyStudent是类名,指向的是类的内存地址。
    school='oldboy'
    def learn(self):
        print(self)
        print('learning...')

    print(learn)        #<function OldboyStudent.learn at 0x00000000028489D8> 是函数名指向的地址

print(OldboyStudent)     #<class '__main__.OldboyStudent'>  这是类名指向的地址。
OldboyStudent()          #这是一个对象,是在调用类的时候产生的
print(OldboyStudent())   #<__main__.OldboyStudent object at 0x00000000024FC748>
print(OldboyStudent.__dict__)  #查看类的名称空间,是一个字典
                               #{'__module__': '__main__', 'school': 'oldboy', 'learn': <function OldboyStudent.learn at 0x00000000028489D8>,
                               # '__dict__': <attribute '__dict__' of 'OldboyStudent' objects>, 
                               # '__weakref__': <attribute '__weakref__' of 'OldboyStudent' objects>, '__doc__': None}

 

 

 

           05、查看类的名称空间: 类名._ _dict_ _        

            print(OldboyStudent.__dict__)  #查看类的名称空间,是一个字典
class OldboyStudent:     #OldboyStudent是类名,指向的是类的内存地址。
    school='oldboy'
    def learn(self):
        print(self)                  #123
        print('learning...')
OldboyStudent.__dict__['learn'](123) #表示把字典中learn的值去取来 加(123)表示调

           06、类的名称空间和类的名称空间

                 - 函数的名称空间:
                    在调用函数时产生,函数调用结束后销毁。

                 - 类的名称空间:
                    在定义阶段时产生,会将类中所有的名字,扔进类的名称空间中。

            2、对象的产生:在调用类时产生对象,在调用类时发生的事情

                 第一步:产生一个空对象的名称空间

                 第二步:自动触发类内容_ _init_ _方法的执行

                 第三步:会将对象本身当做第一个参数,以及调用类括号内所有的参数并传给_ _init_ _

                   01、类名 + () 调用类产生对象

                   02、类的名称空间在定义时产生,对象的名称空间在调用类时产生。

                   03、调用类产生对象的过程称之为类的实例化,对象称之为类的一个实例。

                   04、对象的绑定方法:由对象来调用类内部的函数,对象的绑定方法特殊之处: 会将对象当做第一个参数传给该方法。

 

 例子:

class Student:
school = 'oldboy'
def __init__(self, name, sex, age): # stu1, 'tank', 'male', 17
print(self.__dict__)                                          #查看当前对象的名称空间

# 给对象添加新的属性
self.name = name # stu1.x = 'tank'
self.sex = sex # stu1.y = 'male'
self.age = age # stu1.z = 17
print(self.__dict__)                                          #查看给对象添加新属性后的 对象的名称空间

def learn(self):
print(self) print('learning...')

 

         05、查看对象的名称空间:对象名._ _dict_ _

                        print(obj.__dict__)    #{} #查看类的名称空间,是一个字典 ,默认是个空的。obj 是调用类名时产生的 对象名。

  

class OldboyStudent:     #OldboyStudent是类名,指向的是类的内存地址。
    school='oldboy'
    def learn(self):
        print('learn...')

obj=OldboyStudent()     #这是一个对象,是在调用类的时候产生的
print(obj)
print(obj.__dict__)    #{} #查看类的名称空间,是一个字典.

          06、 想要在调用类时,为对象传入对象独有 特征。(# 注意: 凡是在类内部定义的,__开头或者__结尾的方法都有特殊的意义。)

                00、用    def __init__(self, 形参1, 形参2, ...):
               11、调用类时: 会将对象当做第一个参数,与括号内所有的参数一并传给__init__()

               22、在类内部定义的方法,在调用类时触发,会自动将对象本身当做第一个参数自动传入, 与括号内所有的参数一并传给__init__()。
           例子:

class Student:
    # 学校  ----> attribute --->>属性
    school = 'oldboy'

    # 学习技能   ----> method --->> 方法
    def learn(self):
        print(self)  #<__main__.Student object at 0x000000000BAFC6A0>
        print('learning...') 
stu1
= Student()

print(stu1) #<__main__.Student object at 0x000000000BAFC6A0>

print(stu1.learn()) #learn() 的小括号里不用传参数了,因为stu1.learn()中的 stu1当做实参传给self了

# 在类内部定义的方法,在调用类时触发,会自动将对象本身当做第一个参数自动传入,

例子:

class Student:
    # 学校  ----> attribute --->>属性
    school = 'oldboy'
    def __init__(self, name, sex, age):        # _ _init_ _的用途是给对象 添加属性
        print(self.__dict__)                   #{}
        # 给对象添加新的属性
        self.name = name                       # stu1.x = 'tank'
        self.sex = sex                         # stu1.y = 'male'
        self.age = age                         # stu1.z = 17
        # 查看当前对象的名称空间
        print(self.__dict__)                  #{'name': '坦克', 'sex': 'male', 'age': 18}
# 查看类的名称空间
print(Student.__dict__)               #{'__module__': '__main__', 'school': 'oldboy',
                                      # '__init__': <function Student.__init__ at 0x00000000028489D8>, 'learn': <function Student.learn at 0x000000000BB72730>,
                                      #'__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}

stu1 = Student('tank','female',18)
print(stu1)                          #<__main__.Student object at 0x000000000BAFC6A0>
#也可以直接给对象添加属性,比较麻烦一点
stu1.name = '江鹏'
stu1.sex = 'female'
stu1.age = 84
print(stu1.name, stu1.sex, stu1.age)   #江鹏 female 84

 

 

三、实例化:既是产生对象

调用类产生对象的过程称之为类的实例化,对象称之为类的一个实例。

class Foo:
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z
foo_obj = Foo(10, 20, 30)
print(foo_obj)             #<__main__.Foo object at 0x00000000025DCEB8>
print(foo_obj.__dict__)    #{'x': 10, 'y': 20, 'z': 30}       这是实例化

 

四、对象名字的查找顺序:

      1.对象.属性,会先找对象自己的。     

      2.若对象没有,会去找类的。     

      3.若类没有,则会报错。

例子:

class People:
    country = 'China'
    name = 'jason'

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

    def run(self):
        print('running...')

obj1 = People('tank', 17, 'male')
print(obj1.name)                  # tank  找对象自己的name属性
print(obj1.country)               # China  对象没有,找类中的属性

# print(obj1.jason)               # 对象没有,类也没有,就会报错!
print(obj1.__dict__)

obj1.country = '中国'             # 给对象的名称空间添加 country='中国' 属性
print(obj1.__dict__)
print(People.__dict__)
print(obj1.country)

 

例子:

class Student:
    name = '张全蛋'

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

    def learn(self):
        print('learning...')

stu1 = Student('赵铁柱')      #stu1是类对象
print(stu1.name)             # 结果 赵铁柱,因为对象.属性,会先找对象自己的
stu1.learn()                 #表示把类对象中的 learn函数名的地址拿了出来,加上(),表示调用函数了
print(stu1.learn() )         #None 因为learn函数没有返回值,默认返回的是None

结果:
赵铁柱
learning...
learning...
None

 五、类与对象

需要强调的是:在程序中,必须要事先定义类,然后再调用类产生对象(调用类拿到的返回值就是对象)。产生对象的类与对象之间存在关联,这种关联指的是:对象可以访问到类中共有的数据与功能,所以类中的内容仍然是属于对象的,类只不过是一种节省空间、减少代码冗余的机制,面向对象编程最终的核心仍然是去使用对象。

六、类属性与对象属性

1.类属性:在类中定义的名字,都是类的属性,有两种属性:

   01、数据属性:类中定义的变量是类的数据属性,是共享给所有对象用的,指向相同的内存地址

   02、函数属性:类中定义的函数是类的函数属性,类可以使用,但必须遵循函数的参数规则,有几个参数需要传几个参数

可以通过__dict__访问属性的‘值’,比如Student.__dict__[‘school’]

2.对象属性:操作对象的属性也是一样

类去调用函数时,需要传参

对象去调用函数时,不需要传参。因为绑定到对象的方法特殊之处:绑定给谁就应该由谁来调用,谁来调用,就会将’谁’本身当做第一个参数自动传入

可以通过__dict__访问属性的‘

七、属性的绑定方法:

1、对象的名称空间里只存放着对象独有的属性,而对象们相似的属性是存放于类中的。对象在访问属性时,会优先从对象本身的__dict__中查找,未找到,则去类的__dict__中查找

2、类中定义的函数主要是给对象使用的,而且是绑定给对象的,虽然所有对象指向的都是相同的功能,但是绑定到不同的对象就是不同的绑定方法,内存地址各不相同

3、绑定到对象的方法特殊之处在于,绑定给谁就应该由谁来调用,谁来调用,就会将’谁’本身当做第一个参数自动传入(方法__init__也是一样的道理)

  print(stu1.learn() )         #None 因为learn函数没有返回值,默认返回的是None

 

 八、python中 一切皆对象

              1.python的八大数据类型都是类

              2.定义数据类型的值时,内部自动调用响应的类,然后产生对象。

posted @ 2019-11-25 18:15  薛定谔的猫66  阅读(314)  评论(0)    收藏  举报