Python基础 -- Task10. 类与对象

mac2026-04-18  0

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('老马的程序人生', 'https://blog.csdn.net/LSGO_MYP') x.who() # name : 老马的程序人生 # url : https://blog.csdn.net/LSGO_MYP 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

最新回复(0)