第二十五 Python面向对象编程

面向过程:根据业务逻辑从上到下写代码
面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程

面向对象编程的2个非常重要的概念:类和对象

对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念——类

就相当于制造飞机时的图纸,用它来进行创建的飞机就相当于对象

类与对象的关系:类就是创建对象的模板

13.1. Python定义类并创建实例

13.1.1 类(Class) 由3个部分构成:

类的名称:类名
类的属性:一组数据
类的方法:允许对进行操作的方法 (行为)
对象 = 属性 + 方法
静态 + 动态
引入:

  • 案例一:人类设计,只关心3样东西:
    事物名称(类名):人(Person)
    属性:身高(height)、年龄(age)
    方法(行为/功能):跑(run)、打架(fight)

  • 案例二:狗类的设计
    类名:狗(Dog)
    属性:品种 、毛色、性别、名字、 腿儿的数量
    方法(行为/功能):叫 、跑、咬人、吃、摇尾巴

13.1.2 以 Person 为例,定义一个Person类如下:
class Person(object):
    pass
xiaoming=Person();
xiaohong=Person();
print(xiaoming)#<__main__.Person object at 0x000001C113239128>
print(xiaohong)#<__main__.Person object at 0x000001C113239160>
print(xiaohong==xiaohong)#False

按照 Python 的编程习惯,类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的。类的继承将在后面的章节讲解,现在我们只需要简单地从object类继承。
pass语句什么也不做,一般作为占位符或者创建占位程序,pass语句不会执行任何操作

13.2.创建对象

通过上一节课程,定义了一个Car类;就好比有车一个张图纸,那么接下来就应该把图纸交给生成工人们去生成了
python中,可以根据已经定义的类去创建出一个个对象
创建对象的格式为:
对象名 = 类名()
创建对象demo:

# 定义类
class Car:
    # 移动
    def move(self):
        print('车在奔跑...')

    # 鸣笛
    def toot(self):
        print("车在鸣笛...嘟嘟..")

# 创建一个对象,并用变量BMW来保存它的引用
BMW = Car()
BMW.color = '黑色'
BMW.wheelNum = 4 #轮子数量
BMW.move()
BMW.toot()
print(BMW.color)
print(BMW.wheelNum)

image

总结:

  • BMW = Car(),这样就产生了一个Car的实例对象,此时也可以通过实例对象BMW来访问属性或者方法
  • 第一次使用BMW.color = '黑色'表示给BMW这个对象添加属性,如果后面再次出现BMW.color = xxx表示对属性进行修改
  • BMW是一个对象,它拥有属性(数据)和方法(函数)
  • 当创建一个对象时,就是用一个模子,来制造一个实物

13.3. Python中创建实例属性

虽然可以通过Person类创建出xiaoming、xiaohong等实例,但是这些实例看上除了地址不同外,没有什么其他不同。在现实世界中,区分xiaoming、xiaohong要依靠他们各自的名字、性别、生日等属性。
如何让每个实例拥有各自不同的属性?由于Python是动态语言,对每一个实例,都可以直接给他们的属性赋值,例如,给xiaoming这个实例加上name、gender和birth属性:

class Person(object):
    pass
xiaoming=Person();
xiaohong=Person();
xiaoming.name="小明"
xiaoming.age=12
xiaoming.grade=3

xiaohong.name="小红"
xiaohong.age=19;
xiaohong.sex="女"

print(xiaoming)#地址
print(xiaohong)#地址
print(xiaoming.name)#小明
print(xiaoming==xiaohong)#False

13.4. Python中初始化实例属性

在定义 Person 类时,可以为Person类添加一个特殊的init()方法,当创建实例时,init()方法被自动调用,我们就能在此为每个实例都统一加上以下属性:

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

person1=Person("小明","男",19);
person2=Person("小红","女",20);

print(person1.name,person1.sex,person1.age);#小明 男 19
print(person2.name,person2.sex,person2.age);#小红 女 20

init()方法,在创建一个对象时默认被调用,不需要手动调用init(self)中,默认有1个参数名字为self,如果在创建对象时传递了2个实参,那么init(self)中出了self作为第一个形参外还需要2个形参,例如init(self,x,y)
init(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递进去

13.5. Python中访问限制

我们可以给一个实例绑定很多属性,如果有些属性不希望被外部访问到怎么办?
Python对属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头(__),该属性就无法被外部访问

class Person(object):
    def __init__(self, name, score):
        self.name = name
        self.__score = score
p = Person('Bob', 59)
print(p.name,p._score);

但是,如果一个属性以"xxx"的形式定义,那它又可以被外部访问了,以"xxx"定义的属性在Python的类中被称为特殊属性,有很多预定义的特殊属性可以使用,通常我们不要把普通属性用"xxx"定义。

13.6. python中定义实例方法

一个实例的私有属性就是以__开头的属性,无法被外部访问,那这些属性定义有什么用?
虽然私有属性无法从外部访问,但是,从类的内部是可以访问的。除了可以定义实例的属性外,还可以定义实例的方法。

实例的方法就是在类中定义的函数,它的第一个参数永远是 self,指向调用该方法的实例本身,其他参数和一个普通函数是完全一样的:

class Person:
    def __init__(self,name,age):
        self.__name=name
        self.age=age

    def getName(self):
        return self.__name;

person1=Person("张三",19)
print(person1.getName())

13.7. python中创建类属性

类是模板,而实例则是根据类创建的对象。
绑定在一个实例上的属性不会影响其他实例,
但是,类本身也是一个对象,如果在类上绑定一个属性,则所有实例都可以访问类的属性,并且,所有实例访问的类属性都是同一个!
也就是说,实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。

class Person:
    #声明address地址
    address="earth"
    def __init__(self,name,age):
        self.name=name
        self.age=age

person1=Person('zhangsan',19)
print(person1.address)#earth
print(Person.address)#earth

13.8. python中定义类方法

和属性类似,方法也分实例方法和类方法。
在class中定义的全部是实例方法,实例方法第一个参数 self 是实例本身。

class Person(object):
    count=0
    @classmethod
    def howMany(cls):
        return cls.count
    def __init__(self,name):
        self.name=name
        Person.count=Person.count+1
        print(Person.count,"-----------")

person1=Person("张三");
print(person1.howMany())#1
print(Person.howMany())#1

作者:Anwfly
链接:https://www.jianshu.com/p/9c77e40894d2
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容