本文主要介绍Python面向对象的语法
类
class Student:
def setName(self, n): # self必须显式地作为成员方法的第一个参数
self.name = n # 属性必须加self引用,即使不与形参同名
s = Student() # 创建一个对象,注意不要new
s.setName("Tom")
print(s.name)
运行结果:
Tom
类 属 性 和 实 例 属 性
- 类变量指的是在类中,但在各个类方法外定义的变量。
- 实例变量指的是在任意类方法内部,以“self.变量名”的方式定义的变量。
class Student:
schoolName = "HNUST" # schoolName为类变量
def setName(self, n):
self.name = n # name为实例变量
print(Student.schoolName) # 用类名引用类属性
s = Student() # 创建Student对象
s.setName("张三") # 调用对象的成员方法
print(s.name) # 用对象名引用对象属性
print(s.schoolName) # 用对象名引用类属性
运行结果:
HNUST
张三
HNUST
#注意:注意必须先调用setName,name才成为实例变量
初始化函数
python的初始化函数: __ init __ (self)
python的初始化函数不能重载,不能重载,不能重载!
class Student:
schoolName = "HNUST"
def setName(self, name):
self.name = name
s = Student() # 调用了默认的初始化函数
s.setName("张三")
print(s.schoolName,s.name)
运行结果:
HNUST 张三
python的初始化函数:__init__(self)
class Student:
schoolName = "HNUST"
def __init__(self, name): # 方法名:init前后两个下划线
self.name = name
s = Student("Tom")
print(s.name)
运行结果:
Tom
可以利用带默认形参的构造函数来解决不能重载的问题!
class Student:
schoolName = "HNUST"
def __init__(self, name = "**"):
self.name = name
s = Student() # 不传参,name使用默认值
print(s.name)
s = Student("张三")
print(s.name)
运行结果:
**
张三
封装
在一个类中定义的属性(不管是类属性仍是实例属性),若是是以双下划线开头,那么这个属性是对外 (包括其子类中) 不可见的,类似于 java 中的 private 属性,单下划线类似protected
class Student:
schoolName = "HNUST"
def __init__(self, name, age, sex):
self.name = name # 默认公有成员
self.__age = age # 前面两个下划线的为私有成员
self._sex = sex # 前面一个下划线的为保护成员
s = Student("张三", 18, "男")
s._Student__age = 20 # 伪私有,系统只是将私有属性改名为_Student__age
#print(s.__age) # 报错,无该属性
print(s._Student__age) # 20
继承
class Student:
schoolName = "HNUST"
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
class Undergraduate(Student): # 声明继承:父类名写在子类名后的括号中
def __init__(self, name, age, sex, grade):
super().__init__(self, name, age, sex) # 先调用父类构造方法
self.grade = grade # 初始化子类自己的数据成员
g = Undergraduate("张三",18,"男","二年级")
print(g.name,g.age,g.sex,g.grade)
多态
(1)有继承关系的多态
class Animal(object):
def talk(self):
print('动物叫')
class Cat(Animal):
def talk(self): # 重写talk方法
print('喵!喵!喵!')
class Dog(Animal):
def talk(self): # 重写talk方法
print('汪!汪!汪!')
cat = Cat()
dog = Dog()
an = Animal()
an = cat
an.talk()
an = dog
an.talk()
(2)对象所属的类之间没有继承关系
调用同一个函数, 传入不同的参数(对象),可以达成不同的功能。
class Cat:
def talk(self):
print('喵!喵!喵!')
class Dog:
def talk(self):
print('汪!汪!汪!')
def func(an):
an.talk()
func(Cat())
func(Dog())
运行结果:
喵!喵!喵!
汪!汪!汪!