Python学习笔记(13)-Python类与对象示例

1. 简介

Python支持面向对象编程,所以Python可以很容易地用面向对象的观点来组织代码,实现业务逻辑处理。

Python是一种动态语言,所以它的面向对象机制的定义和使用都挺有意思,所以本篇主要内容:

  • Python类的定义
  • Python类的动态语言特性
  • Python类中属性的访问控制

2. Python类的定义

举个栗子先:

class Car:#类名Car
    madein="中国"#类属性
    def setCarInfo(self):#类方法
        self.name="解放牌汽车";#类的实例属性

print(Car.madein)#通过类名直接访问类属性,输出:中国
car=Car()#初始化
print(car.madein)#通过对象访问类属性,输出:中国

car.setCarInfo()#调用方法
print(car.name)##访问实例属性,输出解放牌汽车

具体解释下:

  1. 类定义关键字为class
  2. 类方法定义与普通方法定义的区别是第一个参数必须是self,self代表的是类的实例化对象
  3. 类的属性分为两种,类属性和实例化属性,类属性是类所有对象共有的一个属性,可以通过类或者对象访问。而实例属性每个对象都拥有一个。
  4. 实例属性需要借助方法来实现,在方法中有self.XXX=123。则表示定义了实例属性XXX。

3. Python类的动态语言特性

好的,到目前为止一切正常,但是看下面一个例子:

class Car:#类名Car
    madein="中国"#类属性
    def setCarInfo(self):#类方法
        self.name="解放牌汽车";#类的实例属性
car=Car()
print(car.name)#报错信息:AttributeError: 'Car' object has no attribute 'name'

明明已经定义了类Car的实例属性self.name,但是为什么报错Car没有属性name呢。

这就要从Python语言的动态特性理解,Python语言不是预编译型的,也就是说Python自己都不知道类有什么属性,必须运行过了才知道!

如果先调用car.setCarInfo(),在执行self.name="解放牌汽车"时,此时类才有了实例对象self。所以要想给类定义实例属性,最好是在构造函数中定义,这样就能保证类一旦实例化出对象,该对象就具备了构造函数中的实例属性。如下代码中,因为在执行car=Car()时,调用了构造方法,所以执行了self.name=“解放牌汽车”,所以car.name这一实例属性已存在且被赋值。

class Car:#类名Car
    madein="中国"#类属性
    def __init__(self):#构造方法
        self.name="解放牌汽车";#类的实例属性
car=Car()
print(car.name)#输出解放牌汽车

OK,到这还没完,Python是动态语言嘛,所以其实可以玩的很开,例如:

#类定义
class Car:#定义了类
    madein="中国"#定义了一个类的属性
#实例化
car1=Car()#实例化了一个对象

print(car1.madein)#输出中国
car1.madein="非洲"#注意这是定义了一个实例属性,而类属性也是存在的
print(car1.madein)#输出非洲,因为先访问实例属性
print(Car.madein)#输出中国,类属性依然存在

4. Python类中属性的访问控制

Python也支持类的私有变量,也就是说类里面能访问的,类外面不允许访问。举个例子如下,在类属性名称前面添加__(两个下划线),该属性就成为私有变量,无法直接访问,但是可以通过类方法去访问(或设置)该私有变量的值。

class Car:#类
    def __init__(self):
        self.name="大众"#名字公开
        self.__price="10万"#价格保密
    def getPrice(self):
        return self.__price;
car=Car()#实例化了一个对象
print(car.getPrice())#输出10万
print(car.__price)#报错:AttributeError: 'Car' object has no attribute '__price'

从本篇来看,Python动态语言的本质暴露的十分明显啊。


如有问题请扫码联系我
在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页