1. python中的类和对象
面向对象编程是现代程序设计的一种重要编程模型。面向对象编程(Object Oriented Programming,OOP)是一种通过对象的方式,来实现对真实世界建模的程序设计方法。而在python中,类和对象就是面向对象的重要组成部分。
1.1 什么是类和对象
类就是一种在程序中定义对象属性和方法的结构。它是面向对象编程的基础,所有的对象都是基于类创建的。而对象则是类的一个实例,它包含了类的属性和方法。
在python中,创建一个类需要使用关键字“class”,语法如下所示:
class ClassName:
<statement-1>
.
.
.
<statement-N>
在类的内部,我们可以定义属性和方法,这些属性和方法可以在外部通过对象进行访问。以下是定义一个简单类的示例代码:
class Person:
name = "张三"
age = 18
def say_hello(self):
print("我叫{},今年{}岁。".format(self.name, self.age))
p = Person()
p.say_hello()
在这个例子中,我们定义了一个名为Person的类,它有两个属性(name和age)和一个方法(say_hello)。在方法内部,我们使用了“self”关键字来表示该方法属于一个对象。最后,我们创建了一个名为p的Person对象,并调用了它的say_hello()方法。
1.2 类的继承
类的继承是一种重要的面向对象编程思想,它允许我们在现有类的基础上创建新类。被继承的类被称为父类(或基类),新创建的类称为子类(或派生类)。子类继承了父类的属性和方法,并可以在此基础上添加新的属性和方法。
在python中,我们可以使用“class 子类名(父类名)”的方式来创建一个继承自父类的子类。以下是一个简单的继承示例:
class Animal:
def __init__(self, name):
self.name = name
def eat(self):
print("{}正在吃东西...".format(self.name))
class Dog(Animal):
def __init__(self, name):
super().__init__(name)
def bark(self):
print("{}正在汪汪叫...".format(self.name))
d = Dog("旺财")
d.eat()
d.bark()
在这个例子中,我们定义了一个名为Animal的父类和一个名为Dog的子类。在子类中,我们通过super()函数调用了父类的构造函数,从而继承了父类的属性。然后,我们又添加了一个名为bark()的新方法。
2. 类的属性和方法
2.1 实例属性和类属性
在python中,类包含两种类型的属性:实例属性和类属性。实例属性是指属于对象的属性,而类属性则是指属于类的属性。
实例属性一般在__init__方法中定义,在创建对象时进行初始化。而类属性则是在类定义中直接定义的,所有的对象都共享这些属性。
以下是一个实例属性和类属性的例子:
class Student:
name = "张三" # 类属性
def __init__(self, age):
self.age = age # 实例属性
s1 = Student(18)
s2 = Student(20)
print(s1.name, s1.age) # 张三 18
print(s2.name, s2.age) # 张三 20
Student.name = "李四"
s1.age = 19
print(s1.name, s1.age) # 李四 19
print(s2.name, s2.age) # 李四 20
在这个例子中,我们定义了一个名为Student的类,它拥有一个类属性(name)和一个实例属性(age)。我们创建了两个Student对象,并分别输出了它们的属性值。然后,我们修改了类属性和一个对象的实例属性,并再次输出它们的属性值。
2.2 实例方法和类方法
在类的定义中,我们可以定义两种类型的方法:实例方法和类方法。实例方法是指属于对象的方法,可以访问对象的属性。而类方法则是指属于类的方法,可以访问类的属性。
在python中,实例方法的第一个参数必须是self,表示该方法属于对象。而类方法则使用“@classmethod”装饰器来标识。以下是一个实例方法和类方法的例子:
class Person:
name = "张三"
def __init__(self, age):
self.age = age
def say_hello(self):
print("我叫{},今年{}岁。".format(self.name, self.age))
@classmethod
def set_name(cls, name):
cls.name = name
p1 = Person(18)
p2 = Person(20)
p1.say_hello() # 我叫张三,今年18岁。
p2.say_hello() # 我叫张三,今年20岁。
Person.set_name("李四")
p1.say_hello() # 我叫李四,今年18岁。
p2.say_hello() # 我叫李四,今年20岁。
在这个例子中,我们定义了一个名为Person的类,它拥有一个类属性(name)和一个实例属性(age)。我们创建了两个Person对象,并分别调用了它们的say_hello()方法。然后,我们定义了一个类方法set_name(),用来修改类属性name。最后,我们调用了这个类方法,并再次调用两个对象的say_hello()方法。
2.3 静态方法
静态方法是指属于类的方法,与类和对象都没有关系,不需要访问类或对象的属性和方法。在python中,静态方法使用“@staticmethod”装饰器来标识。以下是一个静态方法的例子:
class Math:
@staticmethod
def add(x, y):
return x + y
print(Math.add(1, 2)) # 3
在这个例子中,我们定义了一个名为Math的类,并创建了一个静态方法add(),用来计算两个数的和。我们使用类名来调用这个静态方法,并传入两个参数,最后输出结果为3。
3. 封装、继承和多态
3.1 封装
封装是指将对象的属性和方法隐蔽起来,不被外部直接访问。这样可以保护属性和方法不被意外修改,增加程序的健壮性。在python中,使用“__”双下划线来表示私有属性和方法。
以下是一个封装的例子:
class Car:
def __init__(self, brand, model):
self.__brand = brand
self.__model = model
def get_brand(self):
return self.__brand
def set_brand(self, brand):
self.__brand = brand
def get_model(self):
return self.__model
def set_model(self, model):
self.__model = model
car = Car("奔驰", "S350")
print(car.get_brand(), car.get_model()) # 奔驰 S350
car.set_brand("宝马")
car.set_model("X5")
print(car.get_brand(), car.get_model()) # 宝马 X5
在这个例子中,我们定义了一个名为Car的类,并将属性brand和model私有化。通过定义get和set方法,可以在外部获取或修改这些属性。我们通过对象访问这些方法,并查看属性值的变化。
3.2 继承
继承是一种重要的面向对象编程思想,它允许我们在现有类的基础上创建新类。被继承的类被称为父类(或基类),新创建的类称为子类(或派生类)。子类继承了父类的属性和方法,并可以在此基础上添加新的属性和方法。
在python中,我们可以使用“class 子类名(父类名)”的方式来创建一个继承自父类的子类。
3.3 多态
多态是一种重要的面向对象编程思想,指的是同样的方法在不同的对象上产生不同的行为。在python中,多态通过方法重写(override)实现。
在方法重写中,子类定义了一个与父类同名的方法,并覆盖了父类的方法。当我们调用子类的该方法时,程序会优先调用子类的方法,从而产生不同的行为。
以下是一个多态的例子:
class Animal:
def say_hello(self):
print("动物在叫...")
class Dog(Animal):
def say_hello(self):
print("汪汪叫...")
class Cat(Animal):
def say_hello(self):
print("喵喵叫...")
a = Animal()
d = Dog()
c = Cat()
a.say_hello() # 动物在叫...
d.say_hello() # 汪汪叫...
c.say_hello() # 喵喵叫...
在这个例子中,我们定义了一个名为Animal的父类和两个名为Dog和Cat的子类。在子类中,我们分别重写了父类的say_hello()方法。然后,我们创建了三个对象,并分别调用了它们的say_hello()方法,从而展示了多态的特性。
4. 总结
python是一种支持面向对象编程的高级编程语言。在python中,类和对象是面向对象编程的重要组成部分,类提供了属性和方法的定义,而对象则包含了实际的属性和方法。通过类的继承,我们可以在现有类的基础上创建新类,并继承了父类的属性和方法。另外,多态是一种重要的面向对象编程思想,采用方法重写的方式实现。以上内容是python中类和对象的基础知识,对于深入学习python及其他面向对象编程语言都有着很好的指导意义。