python基础之面向对象-上

一、什么是面向对象

面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段的产物。

二、为什么要面向对象

因为面向对象能够解决系统的可维护性可拓展性可重用性
1、不同于C语言的面向过程,python面向对象是符合客观世界人们思考问题的方式,计算机毕竟只是一个工具,用于帮助人们解决问题,你可以写出很复杂的代码,对于计算机而言它可以按部就班、迅速顺利的完成任务,而代码量陡增的时候,这些代码的维护就比较困难了。
2、面向过程是注重于解决步骤,一个问题可以分为N个步骤去执行,但面向过程注重问题的功能。在现实世界中存在的客体是问题域中的主角,所谓客体是指客观存在的对象实体和主观抽象的概念,他是人类观察问题和解决问题的主要目标。客体有属性和行为。结构化设计方法所采用的设计思路不是将客体作为一个整体,而是将依附于客体之上的行为抽取出来,以功能为目标来设计构造应用系统。这种做法导致在进行程序设计的时候,不得不将客体所构成的现实世界映射到由功能模块组成的解空间中,这种变换过程,不仅增加了程序设计的复杂程度,而且背离了人们观察问题和解决问题的基本思路。另外,再仔细思考会发现,在任何一个问题域中,客体是稳定的,而行为是不稳定的。例如,不管是国家图书馆,还是学校图书馆,还是国际图书馆,都会含有图书这个客体,但管理图书的方法可能是截然不同的。结构化设计方法将审视问题的视角定位于不稳定的操作之上,并将描述客体的属性和行为分开,使得应用程序的日后维护和扩展相当困难,甚至一个微小的变动,都会波及到整个系统。面对问题规模的日趋扩大、环境的日趋复杂、需求变化的日趋加快,将利用计算机解决问题的基本方法统一到人类解决问题的习惯方法之上,彻底改变软件设计方法与人类解决问题的常规方式扭曲的现象迫在眉睫,这是提出面向对象的首要原因。

三、面向对象基本概念

3.1 对象

对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。注意对象指客体,并非“万物皆对象”。

3.2 对象的状态和行为

对象用数值来代表其状态,改变对象状态就是对象的行为

3.3 类

类是具有相同属性和方法的对象的集合。它定义了该集合每个对象共有的属性和方法。对象则是类的实例。

3.4 消息

对象之间进行通信的结构叫做消息。

3.5 方法

类中操作的实现过程叫做方法,一个方法有方法名、返回值、参数、方法体。

四、面向对象特点

4.1 对象唯一性

每个对象都有其自身的唯一标示,通过这种标示能够找到相应的对象,不同对象不能有相同标示。

4.2 抽象性

抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。

4.3 继承性

继承性是面向对象编程语言不同于其他编程语言重要的特点之一,通过子类继承父类或多个父类实现代码的扩充性和复用性。

4.4 多态性

多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。

4.5 封装性

面向对象的类是封装良好的模块,封装可以保证软件内部有优良的模块性。

五、python面向对象

5.1 基本概念

python面向对象主要通过类和对象来实现面向对象的思维,下面介绍一些简单的概念。

5.1.1 类

用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

5.1.2 类变量

定义在类中且在函数体之外就叫类变量。类变量在整个实例化的对象中是公用的。

5.1.3 数据成员

类变量或者实例变量, 用于处理类及其实例对象的相关的数据。

5.1.4 方法

类中定义的函数

5.1.5 对象

对象就是类的实例化。

5.1.6 继承

即一个派生类(derived class)继承基类(base class)的字段和方法。

5.1.7 方法重写

如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

5.1.8 局部变量

定义在方法中的变量叫局部变量。

5.1.9 实例变量

实例变量指的是在任意类方法内部,以“self.变量名”的方式定义的变量,其特点是只作用于调用方法的对象。另外,实例变量只能通过对象名访问,无法通过类名访问。

5.2 python定义类

python通过关键字class+类名来构建类。如下:

class TaoBao:
    # 类体
class CLanguage :
    count = 0    
    def __init__(self):        
        self.name = "C语言"        
        self.age = 18   
    # 下面定义了一个say实例方法    
    def say(self):        
        self.catalog = 13
        money = 2000

从上面的类中我们可以看出:

参数 名称
Clanguage 类名
count 类变量
_init_ 构造方法,在创建类对象时会自动调用
self.catalog 实例变量
say() 方法
money 局部变量
5.3 self

self代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。你也可以把self换成其他的如:jsonwong,代码如下:

class Test:
    def prt(self):
        print(self)
        print(self.__class__)
 
t = Test()
t.prt()

输出:

<__main__.Test object at 0x000001C16F5BB358>
<class '__main__.Test'>

此时你可以把self改为jsonwong也是可以的,如下:

class Test:
    def prt(jsonwong):
        print(jsonwong)
        print(jsonwong.__class__)


t = Test()
t.prt()

输出:

<__main__.Test object at 0x00000212B9F9B358>
<class '__main__.Test'>
5.4 创建实例对象

实例化类其他编程语言中一般用关键字 new,但是在 Python 中并没有这个关键字,类的实例化类似函数调用方式。如上面的类Test调用如下:

t = Test()
t2 = Test()

则t和t2称为类Test的不同对象。

5.5 属性和方法

类的属性和方法可以通过类.属性\类.方法去调用,也可以通过实例化对象调用。
对象.属性名
对象.方法名(参数…)
可以用def关键字定义一个方法。

5.5.1 私有属性

指只能在类中调用,不能在类的外部调用的属性称为私有属性,私有属性以__+属性名组成。在类内部的方法中使用时用 self.__属性名。

5.5.2 私有方法

指只能在类中调用,不能在类的外部调用的方法称为私有方法,私有方法以__+方法名(参数)组成。在类内部的方法中使用时用 self.__方法名(参数)。

5.5.3 例子
class Test:
    __money = 2000
    name = "jsonwong"
    def func_1(self):
        s = self.__money
        c = self.__func()
        print(s,c, "公共方法")

    def __func(self):
        return "私有方法"
t = Test()
print(t.name)
# print(t.__money) # 报错,实例化对象不能访问私有属性
t.func_1()
# t.__func() # 报错,实例化对象不能访问私有方法

上面例子中可以很清楚的看到私有属性和方法可以在类的内部调用,而不能在类的外部调用。不过可以通过object._className__attrName对象名._类名__私有属性名(方法)来访问,如下:

print(t._Test__money)

输出:

2000
5.5.4 实例绑定属性

实例可以通过两种方式来绑定属性,如下:
1、通过self构造函数对实例进行属性绑定
2、一种是直接赋值
但要注意:
1、对象的属性优于类的属性
2、实例的属性优于类的属性
3、当在对象里修改类属性的值时,会在当前对象里新创建一个对象属性,调用时优先调用对象的属性,但类本身的值不会改变
所以尽量要避免类属性和对象属性重名,如果删除对象属性会继续使用类属性。

class Person(object):
    name = "person"
    def __init__(self,name):
        self.name = name
# 调用类的属性
print(Person.name)
person_1 = Person("DD")
# 实例的属性优先于类的属性
print(person_1.name)
person_1.age = 22
print(person_1.age) # 对象临时添加的属性,只对当前对象起作用,其它的都免提

输出:

person
DD
22
5.5.5 类绑定属性

类可以直接通过类.属性来绑定属性,注意类属性对于类的方法和实例化对象都是共用的。

class Person(object):
    name = "person"
    def __init__(self,name):
        self.name = name
Person.money = 2000
per = Person("wx")
print(Person.money)
print(per.money)

输出:

2000
2000
5.5.7 实例绑定方法
# 对象绑定方法
from types import MethodType 
class Stu():
    # 构造方法
    def __init__(self):
        print("I am a stu")
def set_age(self,age):
    self.age = age
# 我想把set_age方法放入到Stu
s = Stu()
s.set_age = MethodType(set_age,s)
s.set_age(18)
print(s.age)

输出:

I am a stu
18

**注意:**给一个实例绑定方法,对另外一个实例是不起作用的,只是针对当前实例。

5.5.8 类绑定方法
# 类绑定方法
from types import MethodType
class Stu():
    # 构造方法
    def __init__(self):
        print("I am a stu")
 
def set_age(self,age):
    self.age = age
 
# 把set_age嵌入到类里
Stu.set_age = MethodType(set_age,Stu) 

注意:给类绑定方法后,所有实例均可调用,而且绑定属性是公共属性,所有对象都可以对其修改。

5.5.9 slots限制class实例添加属性

slots限制class实例能添加的属性添加的属性如果没有在slot限定范围内,会报错。如下:

class Stu():
    __slots__ = ("name","age","height") # 用元组定义允许绑定属性名称

注意:使用__slots__要注意,__slots__定义属性仅对当前类起作用,对继承的子类不起作用,多个属性名可以用元组,集合,列表形式表达。

猜你喜欢

转载自blog.csdn.net/JaysonWong/article/details/105580781