文章目录
前言
Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。
如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程。
接下来我们先来简单的了解下面向对象的一些基本特征。
一、面向对象技术简介
- 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
- 方法: 类中定义的函数。
- 类变量: 类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
- 数据成员: 类变量或者实例变量用于处理类及其实例对象的相关的数据。
- 方法重写: 如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
- 局部变量: 定义在方法中的变量,只作用于当前实例的类。
- 实例变量: 在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
- 继承: 即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
- 实例化: 创建一个类的实例,类的具体对象。
- 对象: 通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
和其它编程语言相比,Python 在尽可能不增加新的语法和语义的情况下加入了类机制。
Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。对象可以包含任意数量和类型的数据。
二、类和对象的基础语法
1.定义类
定义类往往使用class
关键字定义一个类,类名通常采用驼峰命名法。
代码如下(示例):
class MyClass:
# 类的属性和方法定义在这里
pass
2.创建对象
创建类的对象,使用类名后跟一对括号来创建对象,括号中可以传递初始化参数。
my_object = MyClass() # 创建 MyClass 类的一个对象
三、类的属性和方法
在类中可以定义属性
和方法
,对象可以通过点号.
来访问类的属性和方法。
1.类的属性
- self 参数: 在类中定义方法时,第一个参数通常是 self,它表示对象本身,用于访问对象的属性和方法。
- 初始化方法: 类可以定义一个特殊的方法
__init__()
,用于初始化对象的属性。 - 类属性:属性是属于整个类的,它被所有类的实例(对象)共享。如下:Fuel_Type是Car类的一个属性,表示汽车的燃料类型,其默认值为"gasoline"。类属性通常用于描述类的特征或共享的信息。
- 实例属性:实例属性是属于特定类实例(对象)的,每个对象都有自己的一组实例属性。
make
和model
表示汽车的制造商和型号,而running
表示汽车是否正在运行,默认值为False。实例属性通常用于描述特定对象的状态或特征。
class Car:
Fuel_Type = "gasoline"
def __init__(self, make, model):
self.make = make
self.model = model
self.running = False
my_car = Car("Toyota", "Corolla") # 储存属性
print(my_car.model) # 属性的访问
my_car.make = "Audi" # 属性的修改
2.类的方法
我现在想让我的汽车点火启动,需要在Car
类中定义,start()
方法。
class Car:
Fuel_Type = "gasoline"
def __init__(self, make, model):
self.make = make
self.model = model
self.running = False
def start(self):
self.running = True
print(f"我的 {self.make} {self.model} 启动了!")
my_car = Car("Audi", "Rs7")
my_car.start()
我的 Audi Rs7 启动了!
3.类的魔术方法
Python中的魔术方法(Magic Methods)是一种特殊的方法,它们以双下划线开头和结尾,例如__init__
,__str__
,__add__
等。这些方法允许您自定义类的行为,以便与内置Python功能(如+运算符、迭代、字符串表示等)交互。
以下是一些常用的Python魔术方法:
__init__(self, ...)
: 初始化对象,通常用于设置对象的属性。__str__(self)
: 定义对象的字符串表示形式,可通过str(object)
或print(object)
调用。例如,您可以返回一个字符串,描述对象的属性。__repr__(self)
: 定义对象的“官方”字符串表示形式,通常用于调试。可通过repr(object)
调用。__len__(self)
: 定义对象的长度,可通过len(object)
调用。通常在自定义容器类中使用。__getitem__(self, key)
: 定义对象的索引操作,使对象可被像列表或字典一样索引。例如,object[key]
。__setitem__(self, key, value)
: 定义对象的赋值操作,使对象可像列表或字典一样赋值。例如,object[key] = value
。__delitem__(self, key)
: 定义对象的删除操作,使对象可像列表或字典一样删除元素。例如,del object[key]
。__iter__(self)
: 定义迭代器,使对象可迭代,可用于for
循环。__next__(self)
: 定义迭代器的下一个元素,通常与__iter__
一起使用。__add__(self, other)
: 定义对象相加的行为,使对象可以使用+
运算符相加。例如,object1 + object2
。__sub__(self, other)
: 定义对象相减的行为,使对象可以使用-
运算符相减。__eq__(self, other)
: 定义对象相等性的行为,使对象可以使用==
运算符比较。__lt__(self, other)
: 定义对象小于其他对象的行为,使对象可以使用<
运算符比较。__gt__(self, other)
: 定义对象大于其他对象的行为,使对象可以使用>
运算符比较。
四、类的继承
1.继承
Python 支持类的继承,如果一种语言不支持继承,类就没有什么意义。
子类(派生类 DerivedClassName)会继承父类(基类 BaseClassName)的属性和方法。
#继承的语法结构
class DerivedClassName(BaseClassName):
<statement-1>
.
.
.
<statement-N>
#类定义
class people:
#定义基本属性
name = ''
age = 0
#定义私有属性,私有属性在类外部无法直接进行访问
__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,60,3)
s.speak()
2.多继承
在定义一个子类的时候,可以继承多个父类。但是有以下几个需要注意的点。
2.1继承顺序
Python 使用 C3 线性化算法来确定多继承类中方法的查找顺序。MRO 确定了方法解析顺序,即当调用一个方法时,Python 将按照 MRO 的顺序查找该方法。
2.2钻石继承问题
当一个子类同时继承自两个父类,而这两个父类又继承自同一个父类时,就会形成钻石继承结构。这种继承关系就像一个钻石的顶部,子类是钻石的底部,而两个父类是钻石的两侧。在这种情况下,如果不加以处理,可能会导致调用共同祖先的方法时出现重复调用的问题。
为了避免这种情况,Python 使用了 C3 线性化算法。这个算法会按照一定规则对类的继承结构进行排序,确保在调用方法时不会出现重复调用祖先方法的情况。这样就能够保证子类在调用方法时能够正确地按照预期的顺序查找方法,而不会产生意外的行为。
2.3super()函数
super() 函数是用于调用父类(超类)的一个方法。
super() 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
super() 方法的语法:
在子类方法中可以使用super().add()调用父类中已被覆盖的方法
可以使用super(Child, obj).myMethod()用子类对象调用父类已被覆盖的方法
class Parent: # 定义父类
def myMethod(self):
print ('调用父类方法')
class Child(Parent): # 定义子类
def myMethod(self):
print ('调用子类方法')
c = Child()# 子类实例
c.myMethod()# 子类调用重写方法
super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法
2.读入数据
代码如下(示例):
data = pd.read_csv(
'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。