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
关键字后跟类名和类名后:
运算符定义类,这允许您继续在下一个缩进行中定义类成员。
以下是类成员。
也可以在没有任何成员的情况下定义类。下面的示例使用 pass
关键字定义一个空类。
class Student:
pass
类实例化使用函数表示法。要创建类的对象,只需调用一个类,如返回类的新对象的无参数函数,如下所示。
std = Student()
上面,Student()
返回 Student
类的对象,该对象分配给本地variable std
。
Student
类是一个空类,因为它不包含任何成员。
类属性
类属性是直接在类中定义的变量,由类的所有对象共享。 可以使用类名以及对象来访问类属性。
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.schoolName
和std.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 中,构造函数主要用于定义实例属性并分配其默认值。
实例属性
实例属性是附加到类实例的属性或属性。 实例属性在构造函数中定义。
下面的示例定义构造函数中name
和age
的实例属性。
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