python的面向对象
一.python的面向对象的重要术语
二、封装、继承、多态
一.封装
概念
公开属性:可以在类以外的任何地方直接访问。
私有属性:只能在类的内部被直接访问,在对象属性的前面添加两个下划线表示是私有属性。
1.语法
1 class 类名:
2 __属性名 = 属性
2.属性未被私有化
1 class Person:
2 def __init__(self, name, age):
3 # 公开属性
4 self.name = name
5 self.age = age
6
7
8 p1 = Person("jack", 10)
9 # 直接访问
10 print(p1.name, p1.age) # jack 10
11
12 # 修改
13 p1.name = "tom"
14 p1.age = 19
15 print(p1.name, p1.age) # tom 19
3.属性被私有化
工作原理:一个属性一旦被私有化,在底层形成了 _类名__属性名 的属性名 ,但是不建议使用。私有化属性在底层的存在形式根据操作系统或者Python解释器的不同会有所差别,如果直接使用此种方式访问,违背了Python跨平台的特点。
1 class Person:
2 def __init__(self, name, age):
3 self.__name = name
4 self.__age = age
5
6
7 p = Person("jack", 10)
8 print(p.name,p.age) #AttributeError: 'Person2' object has no attribute 'name'
9 print(p.__name) #AttributeError: 'Person2' object has no attribute '__name'
10 print(p._Person__name) # jack
4. 暴露给外界访问的函数
在类外面访问属性,无非涉及到两个操作:获取值,修改值。
1 class Person:
2 def __init__(self, name, age):
3 self.__name = name
4 self.__age = age
5
6 # 返回被私有化属性的值
7 def getname(self):
8 return self.__name
9
10 def setname(self, name):
11 self.__name = name
12
13 def getage(self):
14 return self.__age
15
16 def setage(self, age):
17 if age < 0:
18 age = abs(age)
19 self.__age = age
20
21
22 p = Person("jack", 10)
23 # 获取值
24 r1 = p.getname()
25 print(r1) # jack
26 # 修改值
27 p.setname("tom")
28 r2 = p.getname()
29 print(r2) # tom
30
31 p.setage(-19)
32 print(p.getage()) # 19
二.继承
概念
子类继承父类,可以直接享受父类封装好的方法,不需要再次开发
继承的传递性,子类拥有父类的全部特性,同时也继承有父类的父类的全部特性
1.语法
1 class 类名(父类名):
2 pass
2.单继承
1 #类定义
2 class people:
3 #定义基本属性
4 name = ''
5 age = 0
6 #定义私有属性,私有属性在类外部无法直接进行访问
7 __weight = 0
8 #定义构造方法
9 def __init__(self,n,a,w):
10 self.name = n
11 self.age = a
12 self.__weight = w
13 def speak(self):
14 print("%s 说: 我 %d 岁。" %(self.name,self.age))
15
16 #单继承示例
17 class student(people):
18 grade = ''
19 def __init__(self,n,a,w,g):
20 #调用父类的构函
21 people.__init__(self,n,a,w)
22 self.grade = g
23 #覆写父类的方法
24 def speak(self):
25 print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
26
27
28
29 s = student('ken',10,60,3)
30 s.speak()
输出结果:
1 ken 说: 我 10 岁了,我在读 3 年级
3.多继承
1 #类定义
2 class people:
3 #定义基本属性
4 name = ''
5 age = 0
6 #定义私有属性,私有属性在类外部无法直接进行访问
7 __weight = 0
8 #定义构造方法
9 def __init__(self,n,a,w):
10 self.name = n
11 self.age = a
12 self.__weight = w
13 def speak(self):
14 print("%s 说: 我 %d 岁。" %(self.name,self.age))
15
16 #单继承示例
17 class student(people):
18 grade = ''
19 def __init__(self,n,a,w,g):
20 #调用父类的构函
21 people.__init__(self,n,a,w)
22 self.grade = g
23 #覆写父类的方法
24 def speak(self):
25 print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
26
27 #另一个类,多重继承之前的准备
28 class speaker():
29 topic = ''
30 name = ''
31 def __init__(self,n,t):
32 self.name = n
33 self.topic = t
34 def speak(self):
35 print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic))
36
37 #多重继承
38 class sample(speaker,student):
39 a =''
40 def __init__(self,n,a,w,g,t):
41 student.__init__(self,n,a,w,g)
42 speaker.__init__(self,n,t)
43
44 test = sample("Tim",25,80,4,"Python")
45 test.speak() #方法名同,默认调用的是在括号中排前地父类的方法
输出结果
1 我叫 Tim,我是一个演说家,我演讲的主题是 Python
三.多态
概念
首先Python不支持多态,也不用支持多态。由于Python为动态语言,参数类型没定,所以本身即是多态的
1.例子:
1 class A:
2 def prt(self):
3 print "A"
4 class B(A):
5 def prt(self):
6 print "B"
7 class C(A):
8 def prt(self):
9 print "C"
10 class D(A):
11 pass
12 class E:
13 def prt(self):
14 print "E"
15 class F:
16 pass
17 def test(arg):
18 arg.prt()
19 a = A()
20 b = B()
21 c = C()
22 d = D()
23 e = E()
24 f = F()
25 test(a)
26 test(b)
27 test(c)
28 test(d)
29 test(e)
30 test(f)
输出结果:
1 A
2 B
3 C
4 A
5 E
三、面向对象的各种方法
1.静态方法
概念
所谓静态方法,就是:定义在类中,并且使用 @staticmethod 修饰器修饰,没有 cls 和 self 参数限制的方法我们称之为静态方法。在静态方法中,不会涉及到类中的方法和属性的操作,可以理解为将静态方法寄存在该类的命名空间中。
语法:
1 # 定义的一个类
2 class Person(object):
3 # 类的属性
4 name = "小明"
5
6 # 静态方法
7 # 【1】定义在类中
8 # 【2】使用 @staticmethod修饰器修饰
9 # 【3】没有self、cls这样的参数限制
10 @staticmethod
11 def get_name():
12 return Person.name
调用
对象名.静态方法名()
类名.静态方法名()
语法:
1 class Person:
2 @staticmethod
3 def test():
4 print('我是静态方法')
2.类方法
概念
方法前用装饰器@classmethod修饰。第一个参数为cls代表类
类方法特点:类方法里面不能调用普通方法
语法:
1 class Person:
2 #类方法
3 @classmethod
4 def test1(cls):
5 print('我是类方法')
调用
对象名.方法名()
类名.方法名()
3.属性方法
把一个方法变成一个静态属性,属性就不用加小括号那样的去调用了
语法:
1 class Person():
2 @property
3 def eat(self):
4 print("我是属性方法")
调用
对象名.方法名()
类名.方法名
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)