📅  最后修改于: 2023-12-03 15:19:31.146000             🧑  作者: Mango
Python是一种面向对象的编程语言,即使不去使用面向对象的特性,也会经常使用类或静态变量来组织代码。
在Python中,使用class
关键字来定义类。类可以看作是一种自定义类型,类中可以定义属性和方法。
定义类需要给类指定一个名称,这个名称一般采用驼峰命名法。类的定义通常包含一个__init__
方法,这个方法会在创建对象时被调用,用于初始化对象的属性。
class MyClass:
def __init__(self, name):
self.name = name
def say_hello(self):
print(f'Hello, {self.name}!')
这个类定义了一个MyClass
类,这个类有一个__init__
方法和一个say_hello
方法。__init__
方法有一个name
参数,这个参数用于初始化对象的name
属性。say_hello
方法会在对象上调用,用于输出一条问候消息。
创建类的对象需要使用类名和括号。如果类的__init__
方法需要参数,那么在创建对象时需要传递这些参数。
my_object = MyClass('John')
my_object.say_hello() # 输出 "Hello, John!"
Python中的类可以继承其他类。被继承的类称为父类,继承这个类的类称为子类。子类会继承父类的属性和方法,并可以添加自己的属性和方法。
class Shape:
def __init__(self, x, y):
self.x = x
self.y = y
def area(self):
raise NotImplementedError('area() is not implemented in Shape class')
def perimeter(self):
raise NotImplementedError('perimeter() is not implemented in Shape class')
class Rectangle(Shape):
def __init__(self, x, y, width, height):
super().__init__(x, y)
self.width = width
self.height = height
def area(self):
return self.width * self.height
def perimeter(self):
return 2 * (self.width + self.height)
这个例子定义了一个Shape
类和一个Rectangle
类。Shape
类包含x
和y
两个属性和一个未实现的area
方法和perimeter
方法。Rectangle
类继承了Shape
类,并添加了自己的width
和height
两个属性以及area
方法和perimeter
方法。
类方法和静态方法是类的两个特殊方法。类方法是在类上定义的方法,而静态方法是不与类或对象关联的方法。
类方法使用@classmethod
装饰器来定义。类方法的第一个参数是cls
,指向类本身。
class MyClass:
attribute = 'Hello, world!'
@classmethod
def say_hello(cls):
print(cls.attribute)
这个例子定义了一个MyClass
类,这个类有一个attribute
属性和一个say_hello
方法。say_hello
方法使用@classmethod
装饰器来定义,这使得这个方法成为了类方法。类方法使用cls
参数访问类的属性和方法。
静态方法使用@staticmethod
装饰器来定义。静态方法不使用类或对象的任何属性或方法。
class MyClass:
@staticmethod
def say_hello():
print('Hello, world!')
这个例子定义了一个MyClass
类,这个类有一个say_hello
方法。say_hello
方法使用@staticmethod
装饰器来定义,这使得这个方法成为了静态方法。静态方法不使用类或对象的任何属性或方法。
静态变量是属于类而不是属于对象的变量。静态变量可以在类中定义,但不需要使用对象来使用它们。
class MyClass:
static_attribute = 'Hello, world!'
这个例子定义了一个MyClass
类,这个类有一个static_attribute
属性。这个属性是静态变量,可以通过类名来访问。
print(MyClass.static_attribute) # 输出 "Hello, world!"