类和对象
Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言,而面向对象最重要的概念就是就是 类 和 对象 。
类:用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。类是对象的模板。
对象:而对象是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。
- 对象就是类进行实例化的产物
- 实例化就是由类得到对象的手段
类的创建和实例化
python使用 class 关键字来创建类。class 后面跟类名,类名通常是一大写字母开头的单词。类名的后面跟(superClass),superClass表示的是继承的父类的类名。 最后以冒号结束。
下面是类的语法格式:
class ClassName(superClass):
<statement>
下面的代码定义了一个名为 Person 的类
class Person:
pass
定义Person类的时候没有指定它的父类,这样它默认继承object类。
object类是所有类最终都会继承的类。
然后通过 类名+() 就可以得到类的实例,也就是对象。
>>> xiaoming = Person()
>>> xiaoming
<__main__.Person object at 0x000001F92F190D90>
这样我们就得到了 xiaoming 这个对象。
可以直接给对象添加属性:
>>> xiaoming.name = 'xiaoming'
>>> xiaoming.name
'xiaoming'
定义类是还可以使用类的构造方法 __init__ 将一些必须绑定的属性添加进去。这样在实例化对象是就必须提供对应的参数。
下面我们改造一下 Person 这个类:
class Person:
def __init__(self, name, age) -> None:
self.name = name
self.age = age
def getName(self):
return self.name
def getAge(self):
return self.age
改造过的 Person 类共有两个属性,name(姓名)、age(年龄)。两个方法, getName返回对象的name属性,getAge返回age属性。
现在 Person 类实例化对象时就需要添加参数,如下:
>>> xiaoming = Person('小明',18)
>>> xiaoming.name
'小明'
>>> xiaoming.age
18
>>> xiaoming.getName()
'小明'
>>> xiaoming.getAge()
18
注意:无论是类的构造函数 __init__ 还是类里面定义的方法,它的第一个参数永远是 self ,就是对象本身。
类的特殊变量
1、类变量:
类变量在整个实例化的对象中是公用的,定义在类中且在函数体之外。
>>> class Person:
count = 0
def __init__(self, name, age) -> None:
self.name = name
self.age = age
def getName(self):
return self.name
def getAge(self):
return self.age
上面 Person 类里面的 count 就是一个类变量。
类变量和实例变量的区别:类变量是类的实例化对象所共有的,实例变量是每个对象独有的。
需要特别注意的是:类中定义的类变量如果是引用类型,例如list和dict时,修改一个类的一个实例化对象的类变量是,别的对象也会被修改
class Person:
count = 0
codes = []
def __init__(self, name, age) -> None:
self.name = name
self.age = age
def getName(self):
return self.name
def getAge(self):
return self.age
>>> xiaoming = Person('小明',18)
>>> xiaoqiang = Person('小强',25)
>>> xiaoming.codes.append('123')
>>> xiaoming.codes
['123']
>>> xiaoqiang.codes
['123']
从上面可以看到,修改了xiaoming这个对象的codes这个变量时,xiangqiang的codes变量也被修改了。
注:如果对象变量和类变量存在同名的,则会优先查找对象变量
2、私有变量
在对象外部是可以直接通过调用实例变量的方法来操作数据。如果不想让外部直接访问内部数据,就要用到私有变量。
私有变量的格式就是在前面加 __ ,只要在前面加了 __ 变量就变成了了私有变量。这样外部就不能访问了。
class Person:
def __init__(self,name,age) -> None:
self.__name = name
self__age = age
>>> xm = Person('小明',15)
>>> xm.name
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
xm.name
AttributeError: 'Person' object has no attribute 'name'
>>> xm.__name
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
xm.__name
AttributeError: 'Person' object has no attribute '__name'
上面的代码定义了一个Person类,定义了两个变量__name和__age。然后实例化了一个对象xm,外部直接访问__name这个变量时,都提示不存在这个变量。那么,这时候我们怎么样访问这个变量呢?
答案是用方法。
比如我们要对 __name 这个变量进行操作,我们可以定义set_name和get_name两个方法,在get_name方法返回值,在set_name方法返回值。
class Person:
def __init__(self,name) -> None:
self.__name = name
def set_name(self,name):
self.__name = name
def get_name(self):
return self.__name
>>> xm = Person('小明')
>>> xm.get_name()
'小明'
>>> xm.set_name('小强')
>>> xm.get_name()
'小强'
注:变量名类似__xxx__这样的,以双下划线开头,以双下划线结尾的是特殊变量,可以直接访问的。类似_xxx这样的以单下划线开头的,在外部可以访问,但是最好不要这样做。
小结
- 类是对象的模板,对象则是类进行实例化的产物,各个对象拥有的数据都互相独立,互不影响(除了引用类型的类变量);
- 方法就是对象内部的函数,方法可以直接访问实例的数据;
- object类是所有类最终都会继承的类。