1.1类的定义格式
python使用关键字class 定义类,并在类中定义属性(数据成员)和方法(成员函数),格式如如下:
class<类名>:
<属性定义>
<方法定义>
其中class为关键字,类名的首字母通常为大写字母。
class Person:
def __init__(self, name, gender,age):
self.name= name
self.gender= gender
self.age= age
def display(self):
print('Name:',self .name, 'Gender:' ,self.gender, ' Age: ',self.age)
1.2对象的创立
对象是类的实例,对象的创建过程也是类的实例化过程。创建对象和调用函数类似,如果构造函数__init__()声明有参数,则还需要传入相应的参数;同时,创建对象后还要把他赋给一个变量,使该变量指向对象,否则将无法引用所创建的对象。
class Person:
def __init__(self,name,gender,age):
self.name=name
self.gender=gender
self.age=age
stu1=Person("LiMing","M",19)
stu2=Person("ZhangLi","F",20)
print("Name:",stu1.name,"Gender:",stu1.gender,"Age:",stu1.age)
print("Name:",stu2.name,"Gender:",stu2.gender,"Age:",stu2.age)
执行结果:
Name: LiMing Gender: M Age: 19
Name: ZhangLi Gender: F Age: 20
1.3属性的添加修改和删除
属性的添加:
# author:answer time:2019/11/2
class Person:
def __init__(self,name,gender,age):
self.name=name
self.gender=gender
self.age=age
def displayPerson(self):
print("Name:", stu1.name, "Gender:", stu1.gender, "Age:", stu1.age)
stu1=Person("LiMing","M",19)
stu2=Person("ZhangLi","F",20)
stu1.score=90 #添加属性score
stu2.score=80 #添加属性score
stu1.displayPerson()
print("The score of stu1 is:",stu1.score)
stu2.displayPerson()
print("The score of stu2 is:",stu2.score)
执行结果:
Name: LiMing Gender: M Age: 19
The score of stu1 is: 90
Name: LiMing Gender: M Age: 19
The score of stu2 is: 80
添加或创建属性时,也可以使用setattr()函数;上述属性添加也可改写成:
setattr(stu1,'score',90)
setattr(stu2,'score',80)
属性的修改:
# author:answer time:2019/11/2
class Person:
def __init__(self,name,gender,age):
self.name=name
self.gender=gender
self.age=age
def displayPerson(self):
print("Name:", stu1.name, "Gender:", stu1.gender, "Age:", stu1.age)
stu1=Person("LiMing","M",19)
stu1.age=21 #属性的修改
stu1.displayPerson()
执行结果:
Name: LiMing Gender: M Age: 21
属性的删除:
# author:answer time:2019/11/2
class Person:
def __init__(self,name,gender,age):
self.name=name
self.gender=gender
self.age=age
def displayPerson(self):
print("Name:", stu1.name, "Gender:", stu1.gender, "Age:", stu1.age)
stu1=Person("LiMing","M",19)
stu1.score=90
stu1.displayPerson()
print("The score of stu1 is:",stu1.score)
del stu1.score #删除属性
print(hasattr(stu1,'score')) #判断stu1是否含有score属性
执行结果
Name: LiMing Gender: M Age: 19
The score of stu1 is: 90
False
2.1类属性和对象属性
根据所属的对象,python的属性分为类属性和对象属性(也称实例属性)两种。
- 类属性是在类中方法外定义的属性,既可以通过类名访问,也可以通过对象名访问
- 对象属性只为单独的特定对象拥有,可以在类外显示定义,也可以在类的构造函数__int__()中定义,定义时以self作为前缀,且只能通过对象名访问。
# author:answer time:2019/11/2
class Person:
number=0 #类属性
def __init__(self,name,gender,age): #初始化对象属性
self.name=name
self.gender=gender
self.age=age
Person.number+=1
stu1=Person("LiMing","M",19)
print("Name:",stu1.name,"Gender:",stu1.gender,"Age:",stu1.age)
stu1.score=90 #对象属性在类外定义
print("The score of stu1:",stu1.score)
print(stu1.number)
print(Person.number)
执行结果:
Name: LiMing Gender: M Age: 19
The score of stu1: 90
1
1
# author:answer time:2019/11/2
class Person:
number=0
def __init__(self,name,gender,age):
self.name=name
self.gender=gender
self.age=age
Person.number+=1
stu1=Person("LiMing","M",19)
print(Person.name)
执行结果:(执行出错)
Traceback (most recent call last):
File "C:/Users/answer/PycharmProjects/leiheduixiang/ppp.py", line 10, in <module>
print(Person.name)
AttributeError: type object 'Person' has no attribute 'name'
对象属性只能通过对象名访问,而不能通过类名访问,因此在执行print(Person.name)时出错
2.2公有属性和私有属性
python的公有属性和私有属性通过属性命名方式区分,如果属性名以两个下划线开头,则说明是私有属性,否则是公有属性。私有属性的访问通过如下形式进行:
类的私有属性实例:
<类(对象)名>.<_类名__私有属性>
class JustCounter:
__secretCount = 0 # 私有变量
publicCount = 0 # 公开变量
def count(self):
self.__secretCount += 1
self.publicCount += 1
print(self.__secretCount)
counter = JustCounter()
counter.count() # 1
counter.count() # 2
print(counter.publicCount) # 2
print(counter._JustCounter__secretCount) # 2 Python的私有为伪私有
print(counter.__secretCount)
# AttributeError: 'JustCounter' object has no attribute '__secretCount'
类的私有方法实例:
class Site:
def __init__(self, name, url):
self.name = name # public
self.__url = url # private
def who(self):
print('name : ', self.name)
print('url : ', self.__url)
def __foo(self): # 私有方法
print('这是私有方法')
def foo(self): # 公共方法
print('这是公共方法')
self.__foo()
x = Site('老马的程序人生', '')
x.who()
# name : 老马的程序人生
# url :
x.foo()
# 这是公共方法
# 这是私有方法
x.__foo()
# AttributeError: 'Site' object has no attribute '__foo'
3.内置方法
常用的内置方法:
例:init( )方法:
__init__( )方法是python类的一种特殊方法,也称构造函数,当创建对象时系统自动调用,
用来为对象分配内存并且为属性进行初始化。
# author:answer time:2019/11/2
class Person:
def __init__(self,name,gender,age):
self.name=name
self.gender=gender
self.age=age
stu1=Person("LiMing","M",19)
stu2=Person("ZhangLi","F",20)
print("Name:",stu1.name,"Gender:",stu1.gender,"Age:",stu1.age)
print("Name:",stu2.name,"Gender:",stu2.gender,"Age:",stu2.age)
执行结果:
Name: LiMing Gender: M Age: 19
Name: ZhangLi Gender: F Age: 20
例:del( )方法:
__del__( )方法也称析构函数,用来解释对象占用的存储空间,在python删除对象和收回对象
储存空间时被自动调用和执行。如果用户没有编写析构函数,则python将提供一个默认的
析构函数。
# author:answer time:2019/10/17
#析构函数
class Person:
def __init__(self,name,gender,age):
self.name=name
self.gender=gender
self.age=age
def __del__(self):
print("调用析构函数:",self.name,self.gender,self.age)
stu1=Person("LiMing","M",19)
stu2=Person("ZhangLi","F",20)
print("Name:",stu1.name,"Gender:",stu1.gender,"Age:",stu1.age)
print("Name:",stu2.name,"Gender:",stu2.gender,"Age:",stu2.age)
del stu1
del stu2
执行结果:
Name: LiMing Gender: M Age: 19
Name: ZhangLi Gender: F Age: 20
调用析构函数: LiMing M 19
调用析构函数: ZhangLi F 20
4.1继承和派生
- 继承:子类自动共享父类之间数据和方法的机制
派生类的定义格式:
class<派生类名>(<基类名>):
def __init__(self[,<参数>]):
<基类类名>.__init__(self[,<参数>])
<新增属性定义>
# author:answer time:2019/10/19
#派生类
class Person:
def __init__(self, name, gender,age):
self.name= name
self.gender= gender
self.age= age
def display(self):
print('Name:',self .name, 'Gender:' ,self.gender, ' Age: ',self.age)
class Student (Person) :
def __init__(self, num, major,name,gender,age):
Person.__init__(self,name,gender,age)
self.num= num
self.major= major
def displayStudent (self) :
print('Number:',self.num, 'Major:',self .major)
Person.display(self)
stu1= Student('201710000201','数理','answer9523',"男",19)
stu2= Student('201610050', '软件工程','刘小天','男',20)
stu1. displayStudent()
stu2.displayStudent ()
执行结果:
Number: 201710000201 Major: 数理
Name: answer9523 Gender: 男 Age: 19
Number: 201610050 Major: 软件工程
Name: 刘小天 Gender: 男 Age: 20
- super函数 的使用
super().__init()__
# author:answer time:2019/10/19
#派生类
class Person:
def __init__(self, name, gender,age):
self.name= name
self.gender= gender
self.age= age
def display(self):
print('Name:',self .name, 'Gender:' ,self.gender, ' Age: ',self.age)
class Student (Person) :
def __init__(self, num, major,name,gender,age):
super(Student,self).__init__(name,gender,age)
self.num= num
self.major= major
def displayStudent (self) :
print('Number:',self.num, 'Major:',self .major)
super(Student,self).display()
stu1= Student('201710000201','数理','answer9523',"男",19)
stu2= Student('201610050', '软件工程','刘小天','男',20)
stu1. displayStudent()
stu2.displayStudent ()
4.2多继承
Python 虽然支持多继承的形式,但我们一般不使用多继承,因为容易引起混乱。
class DerivedClassName(Base1, Base2, Base3):
<statement-1>
.
.
.
<statement-N>
需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,Python 从左至右搜索,即方法在子类中未找到时,从左到右查找父类中是否包含方法。
# author:answer time:2019/10/19
#多继承
class Student: #基类Student
def __init__(self,num,name,gender):
self.num=num
self.name=name
self.gender=gender
def displayStudent(self):
print('学号:%s,姓名:%s,性别:%s'%(self.num,self.name,self.gender))
class Teacher: #基类Teacher
def __init__(self,title,major,subject):
self.title=title
self.major=major
self.subject=subject
def displayTeacher(self):
print('职称:%s,专业:%s,课程:%s'%(self.title,self.major,self.subject))
class Assistant(Student,Teacher): #派生类Assistant
def __init__(self,num,name,gender,title,major,subject,salary):
Student.__init__(self,num,name,gender)
Teacher.__init__(self,title,major,subject)
self.salary=salary
def displayAssistant(self):
super(Assistant,self).displayStudent()
Teacher.displayTeacher(self)
print("薪水:",self.salary)
ta=Assistant("201710000201","answer","男","助教","数理","信息","10000")
ta.displayAssistant()
执行结果:
学号:201710000201,姓名:answer,性别:男
职称:助教,专业:数理,课程:信息
薪水: 10000
5.1 方法的重载
方法重载就是在派生类中使用与基类完全相同的方法名,从而重载基类的方法。
# author:answer time:2019/10/19
#方法重载
class Animal:
def display(self):
print("I am a animal!")
class Dog(Animal):
def display(self):
print("I am a dog!")
class Cat(Animal):
def display(self):
print("I am a cat!")
class Wolf(Animal):
def display(self):
print("I am a wolf")
x=[item() for item in (Animal,Dog,Cat,Wolf)]
for item in x:
item.display()
执行结果:
I am a animal!
I am a dog!
I am a cat!
I am a wolf
5.2 运算符重载
什么是运算符重载
让自定义的类生成的对象(实例)能够使用运算符进行操作
作用:
让自定义的实例像内建对象一样进行运算符操作
让程序简洁易读
对自定义对象将运算符赋予新的规则
# author:answer time:2019/10/19
# 运算符重载
class Number:
def __init__(self,a,b):
self.a=a
self.b=b
def __add__(self, x):
return Number(self.a+x.a,self.b+x.b)
def __sub__(self, x):
return Number(self.a-x.a,self.b-x.b)
n1=Number(10,20)
n2=Number(100,200)
m=n1+n2
p=n2-n1
print(m.a,m.b)
print(p.a,p.b)
执行结果:
110 220
90 180