一、面向过程程序设计与面向对象程序设计

面向过程的程序设计:核心是过程,过程就解决问题的步骤,基于该思想设计程序就像是在设计一条流水线,是一种机械式的思维方式
优点:复杂的问题的简单化,流程化
缺点:扩展性差

面向对象的程序设计:核心是对象,对象是特征(变量)与技能(函数)的结合体,是一种上帝式的思维方式

优点:解决了程序的扩展性

缺点:可控性差

二、类和对象

  以游戏举例,基于面向对象设计一个款游戏:英雄联盟,每个玩家选一个英雄,每个英雄都有自己的特征和和技能,特征即数据属性,技能即方法属性,特征与技能的结合体就一个对象

从一组对象中提取相似的部分就是类所有对象都具有的特征和技能的结合体

  在python中,用变量表示特征,用函数表示技能,因而类是变量与函数的结合体,对象是变量与方法(指向类的函数)的结合体

在现实世界中:对象--(共同的特征与技能)-->类
在程序中:先定义类----(实例化)----->对象

1、类的定义

定义类的语法
class 类名:
'''注释'''
类体

#定义一个学生类:类名通常首字母大写表示
class Student:
    school = 'oldboy'
    def __init__(self,name,age):
        #只用来初始化的,并且一定不能有返回值,
        self.name=name
        self.age=age
    def study(self):
        print('is studying')
    def fly(self,x):
        print(x)
        print('%s is flying' %self.name)
    def foo(self):
        print('===========》')

2、类的作用

  类的的用法一:实例化产生对象
  类的的用法二:属性引用

3、对象的作用:

  对象/实例只有一种作用:属性引用 

#类的作用一:实例化对象
s1=Student('egon1',84)
s2=Student('egon2',84)

#类的作用二:类的属性引用
print(Student.school) #引用类的数据属性
print(Student.study) #引用类的函数属性


#对象的用法:属性引用
print(s1.name)
print(s1.age)

  对象/实例本身只有数据属性,但是python的class机制会将类的函数绑定到对象上,称为对象的方法,或者叫绑定方法,绑定方法唯一绑定一个对象,同一个类的方法绑定到不同的对象上,属于不同的方法,内存地址都不会一样

4、类的名称空间与对象名称空间

  创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性

  类有两种属性:数据属性和函数属性,

  其中类的数据属性是共享给所有对象的

>>> id(s1.school) #本质就是在引用类的Student属性,二者id一样
4315241024
>>> id(s2.school)
4315241024

  而类的函数属性是绑定到所有对象的:

>>> id(s1.study) 
4302501512
>>> id(s2.study)
4315244200 

创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性

在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常  

类属性的补充

一:我们定义的类的属性到底存到哪里了?有两种方式查看
dir(类名):查出的是一个名字列表
类名.__dict__:查出的是一个字典,key为属性名,value为属性值

二:特殊的类属性
类名.__name__# 类的名字(字符串)
类名.__doc__# 类的文档字符串
类名.__base__# 类的第一个父类(在讲继承时会讲)
类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
类名.__dict__# 类的字典属性
类名.__module__# 类定义所在的模块
类名.__class__# 实例对应的类(仅新式类中)

5、类的成员:

类的成员可以分为三大类:字段、方法和属性

Python基础(16)_面向对象程序设计(类、继承、派生、组合、接口)

字段

字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同,

  • 普通字段属于对象
  • 静态字段属于
class Province:

    # 静态字段
    country = '中国'

    def __init__(self, name):

        # 普通字段
        self.name = name


# 直接访问普通字段
obj = Province('河北省')
print obj.name

# 直接访问静态字段
Province.country

字段的定义和使用
字段的定义和使用

相关文章:

  • 2021-10-13
  • 2022-12-23
  • 2022-02-25
  • 2021-12-15
  • 2022-12-23
  • 2021-05-29
  • 2021-10-23
  • 2021-12-17
猜你喜欢
  • 2021-05-19
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-08
  • 2022-12-23
相关资源
相似解决方案