面向对象编程

1.面向对象编程介绍

  1. 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  2. 方法:类中定义的函数。
  3. 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
  4. 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
  5. 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
  6. 局部变量:定义在方法中的变量,只作用于当前实例的类。
  7. 实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
  8. 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
  9. 实例化:创建一个类的实例,类的具体对象。
  10. 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。
对象可以包含任意数量和类型的数据。

2.定义类

定义类的基本形式为:
Class <类名><父类名>:
Pass

Class:定义类的关键字
类名:符合标志符规范的名称
父类名:该类继承的父类名称
Pass: 空语句

3.使用类

类在定义后必须先实例化才能使用,一个类可以实例化成多个实例,实例与实例之间互不影响。
[root@python python]# cat 01.py

#!/usr/bin/python
class MyClass:
	"""类的实例"""
	i = 12345
	def f(self):
             return 'hello world'
#实例化类
x = MyClass()
#访问类的属性和方法
print ("MyClass 类的属性 i 为: ",x.i)
print ("MyClass 类的方法 f 为: ",x.f())

[root@python python]# python 01.py
MyClass 类的属性 i 为: 12345
MyClass 类的方法 f 为: hello world

4.类的属性和方法

类的私有属性
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。

类的方法
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。

self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定是用 self。

类的私有方法
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods。

4.1 类的方法

1.方法的第一个参数必须是self,而且不能省略;
2.方法的调用必须实例化类,并以实例名.方法名(参数列表)形式调用;
3.整体运行一个单位的缩进,表示其属于类体中的内容;
[root@python python]# cat 02.py

#!/usr/bin/python
class SmpClass:

	def info(self):
		return "我定义的类!"
	
	def mycacl(self,x,y):
		return x + y
sc = SmpClass()
print ("调用info方法的结果: ",sc.info())
print("调用mycacl方法的结果: ",sc.mycacl(3,4))

[root@python python]# python 02.py
调用info方法的结果: 我定义的类!
调用mycacl方法的结果: 7

4.2 类的属性

类的属性有两类:
1.实例属性
2.类属性
实例属性即同一个类的不同实例,其值是互不关联的,也不会相互影响的,定义时使用”self.属性名”,调用时也使用它;类属性则是同一个类的所有实例所共有的,直接在类中对立定义,引用时使用”类名.类变量名”来引用,只要是某个实例对其进行修改,就会影响其他的所有这个类的实例。
[root@python python]# cat 03.py

#!/bin/usr/python
class demo_pro():
	class_name="demo_pro" #类属性
	def __init__(self,x=0):
		self.x=x      #实例属性
	def class_info(self):
		print('类变量值:', demo_pro.class_name)
		print('实例变量值:',self.x)
	def chng(self,x):
		self.x=x
	def chng_cn(self,name):
		demo_pro.class_name=name
dpa=demo_pro()
dpb=demo_pro()
print('初始化两个实例')
dpa.class_info()
dpb.class_info()
print('修改实例变量')
print('修改dpa实例变量')
dpa.chng(3)
dpa.class_info()
print('修改dpb实例变量')
dpb.chng(10)
dpa.class_info()
dpb.class_info()
print('修改类变量')
print('修改dpa类变量')
dpa.chng_cn('dpa')
dpa.class_info()
dpb.class_info()
print('修改dpb实例变量')
dpb.chng_cn('dpb')
dpa.class_info()
dpb.class_info()

在这里插入图片描述

5.定义构造方法

类定义了 init() 方法,类的实例化操作会自动调用 init() 方法。init() 方法可以有参数,参数通过 init() 传递到类的实例化操作上。
[root@python python]# cat 03.py

#!/usr/bin/python

class Demoint:
	def __init__(self,x=2,y=1):
		self.x01 = x
		self.y01 = y
	def mycacl(self):
		return self.x01 + self.y01

dia = Demoint(1)

print("调用mycacl方法的结果1:")
print(dia.mycacl())

dib = Demoint(3,7)
print("调用mycacl方法的结果2:")
print(dib.mycacl())

[root@python python]# python 03.py
调用mycacl方法的结果1:
2
调用mycacl方法的结果2:
10

6.静态方法

静态方法定义时应使用装饰器@staticmethod 进行修饰,它是没有默认参数的。类方法定义时应使用装饰器@classmethod进行修饰,必须有默认参数“cls”。它们的调用方式可以直接由类名进行调用,调用前可不用实例化类。
[root@localhost 6]# cat 6.6.python

#!/usr/bin/python
class demo():
	@staticmethod    #静态方法的装饰器
	def static_mthd():  #静态类的定义
		print('调用了静态方法!')
	@classmethod     #类方法的装饰器             
	def class_mthd(cls): #类方法定义,带默认参数cls
		print('调用了类方法!')
demo.static_mthd()
demo.class_mthd()
dm=demo()
dm.static_mthd()
dm.class_mthd()

在这里插入图片描述

7.类的继承

[root@python python]# cat 04.py

#!/usr/bin/python
class people:
	name = ''
	age = 0
	#定义私有属性,私有属性在lei 外部无法直接进行访问
	__weight = 0
	def __init__(self,n,a,w):
		self.name = n
		self.age = a
		self.__weight = w
	def speak(self):
		print("%s 说: 我 %d 岁。" %(self.name,self.age))
class student(people):
	grade = ''
	def __init__(self,n,a,w,g):
		#调用父类的构函
		people.__init__(self,n,a,w)
		self.grade = g
	#覆写父类的方法
	def speak(self):
		print("%s 说: 我 %d 岁了,我在读 %d 年级" %(self.name,self.age,self.grade))
s = student('ken',10,6,3)
s.speak()

[root@python python]# python 04.py
ken 说: 我 10 岁了,我在读 3 年级

8.多继承

class PrntA:
    namea = 'PrntA'
    def set_value(self,a):
        self.a = a
    def set_namea(self,namea):
        PrntA.namea = namea
    def info(self):
        print('PrntA:%s,%s' % (PrntA.namea,self.a))
class PrntB:
    nameb = 'PrntB'
    def set_nameb(self,nameb):
        PrntB.nameb = nameb
    def info(self):
        print('PrntB:%s' % (PrntB.nameb,))
class Sub(PrntA,PrntB):
    pass
class Sub2(PrntB,PrntA):
    pass
class Sub3(PrntA,PrntB):
    def info(self):
        PrntA.info(self)
        PrntB.info(self)
print('使用第一个子类:')
sub = Sub()
sub.set_value('aaaa')
sub.info()
sub.set_nameb('BBBB')
sub.info()
print('使用第二个子类:')
sub2= Sub2()
sub2.set_value('aaaa')
sub2.info()
sub2.set_nameb('BBBB')
sub2.info()
print('使用第三个子类:')
sub3= Sub3()
sub3.set_value('aaaa')
sub3.info()
sub3.set_nameb('BBBB')
sub3.info()

在这里插入图片描述

9.方法重写

[root@python python]# cat 05.py

#!/usr/bin/python
class A():
	def myMethod(self):
		return 'AAA'
class B(A):
	def myMethod(self):
		return 'BBB'
b=B()
print(b.myMethod())

[root@python python]# python 05.py
BBB

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老哥爱学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值