欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python面向对象编程(1)

程序员文章站 2024-03-15 23:18:18
...

Python学习笔记:面向对象编程

1. 引例:如何实现不重复造*?

企业的规模、项目变大了,采购或封装的粒度也要相应提高,如果还想小作坊一样,每件物品都自己生产,肯定不现实。必须善于从其他企业拿来或共享一些资源,制造汽车时需要的如汽车*、方向盘、车灯等,这些就是一个个对象,基于这些对象组装汽车就方便多了。
这个原理应用到具体Python代码中,就衍生出了类、对象的概念,如何理解类和对象呢?
首先:类和对象可以看成是比函数更大的封装;类可以继承其他类,这就实现了无须重复早*;当然,也可以基于类生成很多具有不同特点的一个个具体对象;继承类可以使用被继承类的所有属性和方法,也可修改其中的一些方法。
这或许就是面向对象编程的意义。

2.类与实例

在面向对象编程中,先编写类,然后基于类创建实例对象,并根据需要给每个对象赋予一些其他特性。
2.1.创建类
创建类的格式如下:

class class_name:
    '''类的帮助信息'''    #类文档字符串
    statement          ##类体

定义类无须def关键字,类名后也无须小括号,如果要继承其他类,需要添加小括号,类的继承以后有机会会予以介绍。
下面以创建表示人的类为例,讲解用类保存人的基本信息及使用这些信息的方法。

#创建一个表示人的类:
class person:
    '''表示人的基本信息'''
    #定义类的构造函数,初始化类的基本信息
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def display(self):
        print("person(姓名:{},年龄:{})".format(self.name,self.age))

创建类要注意以下几点:
1:在Python中,类的首字母一般大写
2:init()方法
类中的函数称为方法,init()是一个特殊方法,init的前后都是下划线,被称为类的构造函数或初始化方法,实例化类时将自动调用该方法。
前文中的__init__()方法中有三个形参,分别时self、name、age。其中self表示示例本身,而且必须放在其他形参的前面,调用方法时,该参数将自动传入,所以无须写这个实参。self与实例的关系可以由下图概览:Python面向对象编程(1)
3.name、age形参
把这两个形参分别赋给两个带self前缀的变量,即self.name、self.age。带self前缀的变量将与实例绑定,类中的所有方法都可调用它们,这样的变量又称实例属性。
4.display()方法
display()方法中只有一个self形参,它引用了两个实例属性。

2.2创建类的实例
其它编程语言实例化类一般用关键字new,但在Python中无须使用这个关键字,类的实例化类似于函数调用方式。以下代码将person类实例化,并通过__init__()方法接收参数、初始化参数。

根据person类创建实例p1,使用实参“刘易行”,18,调用__init__()方法。访问实例中的方法或属性,使用实例名加句点的方式即可,比如name属性及display()方法。代码实现如下:

#访问实例属性
print(p1.name)  #'刘易行‘
print(p1.age)   #  18
#调用实例方法
p1.display()    #person(姓名:刘易行,年龄:18)

#创建第二个实例
p2=person("纪航",18)
#访问实例属性
print(p2.name)  # ’纪航‘
print(p2.age)   #  18
#调用实例方法
p2.display()    #person(姓名:纪航,年龄:18)

2.3:访问属性
属性根据在类中定义的位置,又可分为类属性和实例属性。类属性是定义在类中,但在各方法外的属性。实例属性是定义在方法内,带self前缀的属性。
2.3.1:创建类
在类person中定义一个类属性percount,代码示例如下:

#创建一个表示人的类
class person:
    '''表示人的基本信息'''
    pernum=0   #类属性
    #定义类的构造函数,初始化类的基本信息
    def __init__(self,name,age):
        self.name=name
        self.age=age
        person.pernum+=1
    def display(self):
        print("person(姓名:{},年龄{})".format(self.name,self.age))
    def display_pernum(self):
        print(person.pernum)

2.3.2:实例化并访问类属性和实例属性

p3=person("唐维泽",18)    #实例化
print(p3.pernum)         #通过实例访问类属性
p3.display_pernum()      #调用实例方法
p4=person("李运航",18)    #实例化
print(person.pernum)     #通过类名访问类属性
print(p4.pernum)         #通过实例访问类属性
p4.display_pernum()      #调用实例方法

类属性可以通过类名或实例名访问。
2.3.3:访问限制
person类中的pernum是类的属性,因各实例都可访问,又称类的共有属性。
共有属性的各实例都可以访问,也可以修改,代码如下:

p4.pernum=10
print(p4.pernum)   #10

但这样对一些属性就不安全了,为了提高一些类属性或实例属性的安全级别,可以设置私有属性,只要在命名时加上两个下划线为前缀即可,如__percount。私有属性只能在类内部访问,实例不能访问。

class person:
    '''表示人的基本信息'''
    pernum=0   #类属性
    __percount=1000  #定义类的私有属性

    # 定义类的构造函数,初始化类的基本信息
    def __init__(self, name, age):
        self.name = name
        self.age = age
        person.pernum += 1
        self.__pwd=123456   #实例私有属性
    def display(self):
        print("person(姓名:{},年龄{})".format(self.name, self.age))
    def display_pernum(self):
        print(person.pernum)

类的私有属性__percount、实例的私有属性__pwd只能在类的内部使用,实例及类的外部不能访问。
2.3.4:内置装饰器 @property
利用python内置的装饰器@property,可以使方法变为属性,这样调用方法时就可不带小括号了。加上装饰器@property还可以把私有属性变为只读,代码示例如下:

class person:
    '''表示人的基本信息'''
    pernum=0 #类属性
    __percount=1000  #定义类的私有属性

    #定义类的构造函数,初始化类的基本信息
    def __init__(self,name,age):
        self.name=name
        self.age=age
        person.pernum+=1
        self.__pwd=123456  #实例私有属性
    def display(self):
        print("person(姓名:{},年龄:{})".format(self.name,self.age))
    #通过添加装饰器,把方法变为属性
    @property
    def display__pernum(self):
        print(person.pernum)
    @property
    def display__percount(self):
        return person.__percount

p6=person("going",18)
p6.display__pernum
p6.display__percount

Here we are, don’t turn away now,
我们在这 现在不要转身离开
we are the warriors that built this town.
我们是建造城市的勇士
From Dust.
平地而起 创造辉煌
The time will come, when you’ll have to rise
那个时刻将要来临 你会
above the best, improve yourself,
脱颖而出 证明自我
your spirit never dies!
你的精神不朽
from warriors -Imagine Dragons