Define Classes in Python

2023-09-17 22:17:34

Python是一种完全面向对象的语言。 从这些教程开始,您就一直在使用类和对象。 Python 程序中的每个元素都是类的对象。程序中使用的数字、字符串、列表、字典等是相应内置类的对象。 可以使用 type() 方法检索变量或对象的类名,如下所示。

num=20
print(type(num)) #<class 'int'>
s="Python"
print(type(s)) #<class 'str'>

定义类

Python 中的类可以使用 class 关键字定义。

class <ClassName>:
    <statement1>
    <statement2>
    .
    .
    <statementN>

根据上面的语法,使用 class 关键字后跟类名和类名后:运算符定义类,这允许您继续在下一个缩进行中定义类成员。 以下是类成员。

  1. Class Attributes
  2. Constructor
  3. Instance Attributes
  4. Properties
  5. Class Methods

也可以在没有任何成员的情况下定义类。下面的示例使用 pass 关键字定义一个空类。

class Student:
    pass

类实例化使用函数表示法。要创建类的对象,只需调用一个类,如返回类的新对象的无参数函数,如下所示。

std = Student()

上面,Student()返回 Student 类的对象,该对象分配给本地variable stdStudent类是一个空类,因为它不包含任何成员。

类属性

类属性是直接在类中定义的变量,由类的所有对象共享。 可以使用类名以及对象来访问类属性。

class Student:
    schoolName = 'XYZ School' 

上面,schoolName是在类中定义的类属性。除非显式修改,否则所有对象的schoolName值将保持不变。

print(Student.schoolName) #'XYZ School'
Student.schoolName = 'ABC School'
print(Student.schoolName)  #'ABC School'
std = Student()
print(std.schoolName)  #'ABC School'
std.schoolName = 'Super School'
print(std.schoolName)  #'Super School'
print(Student.schoolName) #'ABC School'
    

如您所见,类属性由Student.schoolNamestd.schoolName访问。 使用类名更改类属性的值将在所有实例中更改它。但是,使用实例更改类属性值不会反映到其他实例或类。

下面的示例演示如何使用类属性 count

class Student:
    count = 0
    def __init__(self):
        Student.count += 1                

在上面的示例中,count 是 Student 类中的一个属性。 每当创建新对象时,count 的值都会递增 1。 现在,您可以在创建对象后访问 count 属性,如下所示。

std1=Student()
print(Student.count) #1
std2 = Student()
print(Student.count) #2
std3 = Student()
print(Student.count) #3

构造函数

在 Python 中,每当实例化类的新对象时,都会自动调用构造函数方法,这与 C# 或 Java 中的构造函数相同。 构造函数必须具有特殊名称__init__()和一个名为 self 的特殊参数。

注意: 类中每个方法的第一个参数必须是 self ,它指的是调用对象。 但是,您可以为第一个参数指定任何名称,而不必self

下面的示例定义一个构造函数。

class Student:
  def __init__(self): # constructor method
    print('Constructor invoked')
s1 = Student()
s2 = Student()

在上面的示例中,无论何时创建 Student 类的对象,都将调用 __init__() 构造函数方法。

在 Python 中,构造函数主要用于定义实例属性并分配其默认值。

实例属性

实例属性是附加到类实例的属性或属性。 实例属性在构造函数中定义。

下面的示例定义构造函数中nameage的实例属性。

class Student:
    schoolName = 'XYZ School' # class attribute
    def __init__(self): # constructor
        self.name = '' # instance attribute
        self.age = 0 # instance attribute

您可以使用点表示法获取或设置实例属性的值:[instance name].[attribute name] ,如下所示。

std = Student()
print(std.name) #''
print(std.age) #0
std.name = "Bill"
std.age=25 
print(std.name) #'Bill'
print(std.age)  #25

可以通过构造函数指定实例属性的值。 以下构造函数包括 name 和 age 参数,而不是 self 参数。

class Student:
    def __init__(self, name, age): 
        self.name = name
        self.age = age
std = Student('Bill',25) #passing values to constructor
print(std.name)
print(std.age)

如您所见,您可以在创建实例时传递属性值。

注意: 不必指定self参数的值。它将在 Python 内部分配。

您还可以为实例属性设置默认值。下面的代码设置构造函数参数的默认值。 因此,如果在创建对象时未提供值,则将在稍后分配这些值。

class Student:
    def __init__(self, name="Guest", age=25)
        self.name=name
        self.age=age
std = Student()
print(std.name)  #'Guest'
print(std.age)   #25

访问class attributes vs instance attributes in Python了解更多信息。

类属性

在 Python 中,可以使用 property() function 定义类中的属性。

Python 中的 property() 方法为实例属性提供了一个接口。 它封装实例属性并提供属性,与 Java 和 C# 相同。

property() 方法将 get、set 和 delete 方法作为参数,并返回 property 类的对象。

下面的示例演示如何使用 property() 函数在 Python 中创建属性。

class Student:
  def __init__(self):
    self.__name=''
  def setname(self, name):
    print('setname() called')
    self.__name=name
  def getname(self):
    print('getname() called')
    return self.__name
  name=property(getname, setname)
#create object  
std = Student()
std.name="Steve" #calls setname()
print(std.name)  #calls getname()

在上面的示例中,property(getname, setname)返回属性对象并将其分配给name 。因此,name属性隐藏了private instance attribute __name。 直接访问 name 属性,但在内部它将调用 getname()setname() 方法。

注意:建议使用 property decorator 而不是 property() 方法。

class Methods

您可以使用 def 关键字在类中定义任意数量的方法。 每个方法都必须具有第一个参数,通常命名为 self ,它引用调用实例。

class Student:
    def displayInfo(self): # class method
        print('Student Information')
#create object    
std = Student()
std.displayInfo() #calling method

在上面的displayInfo()方法中,self只是第一个参数的常规名称。 该方法可以调用为 object.method()

该方法的第一个参数不需要命名为 self 。您可以提供引用调用方法实例的任何名称。 以下displayInfo()方法将第一个参数命名为 obj 而不是 self,并且工作正常。

class Student:
    def displayInfo(obj): # class method
        print('Student Information')

在类中定义不带 self 参数的方法将在调用方法时引发异常。

class Student:
    def displayInfo(): # method without self parameter
        print('Student Information')
std = Student()
std.displayInfo() #error

该方法可以使用 self 参数访问实例属性。

class Student:
    def __init__(self, name, age): 
        self.name = name 
        self.age = age 
    def displayInfo(self): # class method
        print('Student Name: ', self.name,', Age: ', self.age)

现在可以调用该方法,如下所示。

std = Student('Steve', 25)
std.displayInfo()

删除属性、对象、类

您可以使用 del 关键字删除属性、对象或类本身,如下所示。

class Student:
  def __init__(self, name, age): 
    self.name = name 
    self.age = age 
  def displayInfo(self): # class method
    print('Student Name: ', self.name,', Age: ', self.age)
    
std = Student('Steve', 25)
std.displayInfo()
del std.name # deleting attribute
print(std.name) #error
del std
print(std.name) #error
del Student  # deleting class
std = Student('Steve', 25) #error