Python面向对象编程-基础
编程式范式分为:面向过程的编程范式和面向对象的编程范式
编程式范式:就是程序员使用特定的语法+数据结构和算法编写代码,最终的目的是告诉计算机来解析并且来执行这些代码。
面向过程的编程范式:也就是说流程化的干一件事,严格的按照顺序来进行,就像流水线的工作一样,主要针对的是C语言。
面向对象的编程范式:站在上帝的视角,世间万物一切皆对象。
二、类
1、类的定义解读
类:把拥有相同特征或者行为的事物进行归类,这一过程叫class。它是抽象的,不能直接使用。
特征也被称为属性。
行为也被称为方法。
比如:我们定义一个人,人里面包含年龄,姓名,性别等特征。
注意:在程序里应先定义类,再对类进行一系列的实例化。
class定义类的时候,类的首字母必须大写。比如:class Person()。
在Python中定义类,使用的关键字是class,所有类的基类是object,即是一切类的“祖先”。
经典类:没有object;新式类:在Python3中,所有的类都继承object。
2、类的内置方法:
__init__:类的构造方法,初始化
__del__:类的清理方法
__str__:返回对象的字符串
__doc__:返回document的信息
__call__:对象加()返回的内容
示例如下:
1 class Person(object): 2 '''定义人类''' 3 4 def __init__(self): 5 print("初始化") 6 7 def __del__(self): 8 print("清理") 9 10 def __str__(self): 11 return "返回对象的字符串" 12 13 def __call__(self, *args, **kwargs): 14 print("对象加()返回的内容") 15 obj=Person() 16 print(obj) 17 obj() 18 print(obj.__doc__)
运行结果如下:
初始化
返回对象的字符串
对象加()返回的内容
定义人类
清理
Process finished with exit code 0
三、对象:是由类创建出来的一个具体存在的,可以直接使用。
1、类与对象的关系
a:先有类,再有对象.
b:类只有一个,而对象可以有很多个,不同对象之间的属性可能是各不相同的。
c:类中定义了什么属性和方法,对象中就有什么属性和方法。
四、类和对象
1、示例解释
1-1:在Python中定义一个只包含方法的类:
1 class 类名(object): #object是基类,是一切类的“祖先”,而且类的首字母必须“大写” 2 def 方法1(self,参数列表): 3 内容 4 def 方法2(self,参数列表): #必须有“self” 5 内容
注意:类名的命名规则:每个单词的首字母都要大写;单词与单词之间没有下划线。
1-2:当一个类定义完后,要使用这个类来创建对象:
对象变量=类名() #叫做类的实例化过程
如下图所示:
1 class Person(object): #object是基类,是一切类的“祖先”,而且类的首字母必须“大写” 2 def show(self): #self叫做类的本身,“def show(self)”叫做类的方法(函数) 3 print("人是有姓名、性别、年龄的。")
#创建人的对象 4 obj=Person() #使用类来创建对象 #"obj"只是个代号,我们也可以起其它的名字 5 obj.show()
运行结果如下:
人是有姓名、性别、年龄的。
Process finished with exit code 0
1-3:在类的外部给已经实例化的对象添加属性,并通过类内部方法来打印类内部的信息:
1 class Person(object): 2 def show(self): 3 print("人是有姓名、性别、年龄的。") 4 #创建人的对象 5 obj=Person() 类的实例化,对象叫做“obj” 6 obj.show() 7 obj.city="xi'an" #在类的外部给已经实例化的对象添加属性 8 print(obj.city)
运行结果如下:
人是有姓名、性别、年龄的。 xi'an Process finished with exit code 0
1-4:类有一个名为 __init__() 的特殊方法(构造方法/函数),该方法在类实例化时会自动调用。
1 class Person(object): 2 def __init__(self, name, age): 3 self.username=name #self.属性名=属性的初始值 4 self.old=age 5 x=Person(name="Lucy",age=23) #要调用类里面的变量,以及方法等,首先要进行实例化
#对象名=类名() x是类Person()的实例化的对象,类实例化的过程,也是类初始化的过程
6 print(x.username,x.old)
运行结果如下:
Lucy 23
Process finished with exit code 0
1-5:综合上面的知识点示例:
1 class Person(object): #object是基类,是一切类的“祖先”,而且类的首字母必须“大写” 2 def __init__(self,name,age): #Person()类的方法里需要形参,这时init()里的属性,充当Person()类里的形参 3 #"name,age"可以理解为类的属性 4 self.name=name #实例属性 5 self.age=age #实例属性 6 def show(self): #self叫做类的本身,“def show(self)”叫做类的方法(函数) 7 print("Hello World!") 8 print("name:{0},age:{1}".format(self.name,self.age)) 9 obj=Person(name="Lucy",age=23) #类的实例化 10 obj.show() 11 obj.city="China" #给已经实例化的对象添加属性 12 print(obj.city)
运行结果如下:
Hello World! name:Lucy,age:23 China Process finished with exit code 0
1-6:__del__(self)方法:希望在对象被销毁之前,在执行一些操作
1 class Person(object): 3 def __init__(self,name,age):
#Person()类的方法里需要形参,这时init()里的属性,充当Person()类里的形参
#"name,age"可以理解为类的属性 4 self.name=name #实例属性 5 self.age=age #实例属性 6 print("start") 7 #清理操作 8 def __del__(self): 9 print("end") 10 def show(self): #self叫做类的本身,“def show(self)”叫做类的方法(函数) 11 print("name:{0},age:{1}".format(self.name,self.age)) 12 obj=Person(name="Lucy",age=23) #类的实例化 13 obj.show() 14 obj.name="China" #类的实例化对象添加属性 15 print(obj.name)
运行过程的执行顺序:def _ _init_ _() >def show(self) > print(obj.name) > def _ _del_ _(self)运行结果如下:
start name:Lucy,age:23 China end Process finished with exit code 0
五、属性查找
1-1:实例属性:在实例对象中定义的属性。
1-2:数据属性(类属性):在类中定义的属性,并且多个实例对象之间共享一份类属性。使用方式:
类名.类属性
也可以是: 对象名.类属性
具体表现在:
1 class Animal(object): 2 address="earth" #数据属性(类里面的变量),全局变量 3 def __init__(self,age): 4 self.age=age 5 def show(self): 6 print("It comes from {0},and age is {1}.".format(self.address,self.age)) 7 objAnimal=Animal(age=23) #实例属性 8 objAnimal.show() 9 print(objAnimal.address) 使用 对象名.类属性来打印 10 print(objAnimal.age)
运行结果如下:
It comes from earth,and age is 23. earth 23 Process finished with exit code 0
六、类的方法
1-1:在Python的类里面编写的特性函数叫做方法,这些方法主要分为:
1-1-1:普通方法(方法可以读写):默认有个self参数,且只能被对象调用。
定义与调用格式:
语法: def 方法名(self,参数1,参数2): 方法体 调用:
对象名=类名(属性值)
对象名.方法名(属性值)
示例如下:
1 #展示1 2 class Person(object): 3 def show(self): 4 print("My name is Lucy") 5 people=Person() 6 people.show()
7 #展示2 8 class Person(object): 9 def show(self, name, age): 10 self.name = name 11 self.age = age 12 print("My name is {0} and I am {1} years old.".format(self.name, self.age)) 13 people=Person() 14 people.show(name="Lucy", age=23)
15 #展示3 16 class Person(object): 17 def __init__(self,name,age): 18 self.username=name 19 self.old=age 20 def show(self): 21 print("My name is {0} and I am {1} years old.".format(self.username,self.old)) 22 people=Person(name="Lucy",age=23) 23 people.show()
运行结果如下:
My name is Lucy My name is Lucy and I am 23 years old. My name is Lucy and I am 23 years old. Process finished with exit code 0
1-1-2:特性方法(具备只读属性,方法不能有形式参数),会使用装饰器@property修饰。
定义与调用格式:
语法: @property def 方法名(self): 方法体 调用: 对象名=类名(属性值) 对象名.方法名
示例如下:
1 class Person(object): 2 def __init__(self,name,weight,height): 3 self.name=name 4 self.weight=weight 5 self.height=height 6 @property #装饰器 7 def info(self): #特性方法,只有"self" 8 print("Hello World!") #特性方法可以读取出来 9 @property #装饰器 10 def getBMI(self): #特性方法,只有"self" 11 return self.weight/(self.height**2) 12 people=Person(name="Mike",weight=70,height=1.8)#实例属性 13 people.info #特性方法这里无括号,因而只能读不可以写 14 print(people.getBMI)
运行结果如下:
Hello World! 21.604938271604937 Process finished with exit code 0
1-1-3:静态方法(属于类,只能使用类名来调用),一般将数据属性使用静态方法处理。 使用装饰器@staticmethod来修饰。
定义与调用格式:
语法: @staticmethod def 方法名(): 方法体 调用: 对象名=类名() 对象名.方法名()
示例如下:
1 class Animal(object): 2 # address="地球" #数据属性(类里面的变量),全局变量 3 @staticmethod 4 def address(): 5 print("地球") 6 objAnimal=Animal() #实例属性 7 Animal.address()
运行结果如下:
地球
Process finished with exit code 0
1-1-4:动态参数:
所谓的动态参数就是在写函数时,你可以传递1个参数,2个参数,3个参数甚至更多,同时也可以忽略它。
动态参数:一般有两种表示方法: *args
和**kwargs
,它的区别不是在于 args
和kwargs
这里可以替换成任意字母,这里最主要的区别是*
和**。
*args
:1个*
表示接收的任意参数,调用的时候,会将实际参数以元组的形式传给形式参数。如果参数是一个列表,将会把整个列表当做一个参数传递。
示例如下:
1 class Animal(object): 2 def func(self,*args): #动态参数 3 print(args) 4 objAnimal=Animal() 5 objAnimal.func("a","b","c") 6 objAnimal.func(["1","2","3"])
运行结果如下:
('a', 'b', 'c') (['1', '2', '3'],) Process finished with exit code 0 Process finished with exit code 0
**kwargs
:2个**
表示接收的是任意键值对的关键字参数,这里调用的时候是以字典的形式传递给形式参数。
示例如下:
1 class Animal(object): 2 def func(self,**kwargs): #动态参数 3 print(kwargs) 4 objAnimal=Animal() 5 objAnimal.func(name="dog",age=2)
运行结果如下:
{'name': 'dog', 'age': 2} Process finished with exit code 0
1-1-5:综合运用
示例如下:
1 class Animal(object): 2 def __init__(self,name,height): 3 self.name=name 4 self.height=height
5 def show(self,weight): #普通方法 6 self.weight=weight 7 print("The animal name is {0} and it weight is {1}.".format(self.name,self.weight))
8 def func(self,**kwargs): #动态参数 9 print(kwargs)
10 @staticmethod #静态方法 11 def address(): 12 print("地球")
13 @property #动态参数 14 def getHeight(self): 15 return self.height
16 objAnimal=Animal(name="dog",height=12) 17 objAnimal.show(weight=10) 18 objAnimal.func(name="dog",age=2) 19 print(objAnimal.getHeight)
运行结果如下:
The animal name is dog and it weight is 10. {'name': 'dog', 'age': 2} 12 Process finished with exit code 0