Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。本章节我们将详细介绍Python的面向对象编程。如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程。
接下来我们先来简单的了解下面向对象的一些基本特征。
使用 class 语句来创建一个新类,class 之后为类的名称并以冒号结尾:
class Person:
def say(self):
print("Hello World")
类创建实例:
class Person:
username = ""
password = ""
def __init__(self,username,password):
self.username = username
self.password = password
def getUsername(self):
return self.username
def getPassword(self):
return self.password
user = Person("admin","123456")
print(user.getUsername())
print(user.getPassword())
注意:
1. 第一种方法__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法
2. self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。
通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类。
语法
class 派生类名(基类名)
1、如果在子类中需要父类的构造方法就需要显式的调用父类的构造方法,或者不重写父类的构造方法。详细说明可查看: python 子类继承父类构造函数说明。
2、在调用基类的方法时,需要加上基类的类名前缀,且需要带上 self 参数变量。区别在于类中调用普通函数时并不需要带上 self 参数
3、Python 总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
class Person:
username = ""
password = ""
def __init__(self,username,password):
self.username = username
self.password = password
def getUsername(self):
return self.username
def getPassword(self):
return self.password
class Admin(Person):
isAdmin = True
def __init__(self,username,password,isAdmin):
super().__init__(username,password)
self.isAdmin = isAdmin
def printInfo(self):
print("Username: " + self.username + "\nPassword: " + self.password + "\nAdmin: " + str(self.isAdmin))
admin = Admin("admin","123456",True)
admin2 = Admin("user","123456",False)
admin.printInfo()
admin2.printInfo()
在子类中我们可以使用super()来调用父类中的构造函数、变量和方法
如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法。
class Person:
username = ""
password = ""
def __init__(self,username,password):
self.username = username
self.password = password
def getUsername(self):
return self.username
def getPassword(self):
return self.password
def printInfo(self):
print("Username: " + self.username)
print("Password: " + self.password)
class Admin(Person):
isAdmin = True
def __init__(self,username,password,isAdmin):
super().__init__(username,password)
self.isAdmin = isAdmin
def printInfo(self):
print("Username: " + self.username + "\nPassword: " + self.password + "\nAdmin: " + str(self.isAdmin))
user = Person("user1","123456")
user.printInfo()
admin = Admin("admin","123456",True)
admin2 = Admin("user","123456",False)
admin.printInfo()
admin2.printInfo()
类的私有属性和私有方法类似于Java的private访问修饰符,又有不同的地方。
类的私有属性
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
类的方法
在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数
类的私有方法
__private_method:两个下划线开头,声明该方法为私有方法,不能在类的外部调用。在类的内部调用 self.__private_methods
class User:
__username=""
__password=""
def __init__(self,username,password):
self.__username=username
self.__password=password
def getUsername(self):
return self.__username
def setUsername(self,username):
self.__username=username
def getPassword(self):
return self.__password
def setPassword(self,password):
self.__password=password
user = User("admin","123123")
print(user.getUsername())
user.setPassword("123456")
print(user.getPassword())
单下划线、双下划线、头尾双下划线说明:
__foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的。
_foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。