1、类的属性
类的属性,即定义在类中的变量(成员变量)。通常情况下,我们可以在类的构造方法中初始化一些属性,例如:
动手练一练:
# 定义一个名为Person的类
class Person:
# 初始化函数(构造函数)
def __init__(self, name):
self.name = name # 将传入的参数赋值给类的属性name
self.age = 18
# 创建一个Person类的实例
person = Person("张三")
print(person.name)
print(person.age)
执行以上代码,输出结果为:
张三
18
上面的例子中,我们定义了Person类,并在类的构造函数中初始化了name和age两个属性。我们可以通过实例对象的属性访问方式来获取或修改这些属性的值。但是这里需要注意的是,属性(或者叫成员变量、类变量)必须要使用“self”加上一个点“.”的方式赋值,如“self.x = y”,“self”表示实例自身的。类的属性不能直接定义变量,如“x = y”,直接定义的变量的生命周期只会在“_init_()”函数内,函数执行完变量就会被销毁。例如:
动手练一练:
# 定义一个名为Person的类
class Person:
# 初始化函数(构造函数)
def __init__(self, name):
self.name = name # 将传入的参数赋值给类的属性name
age = 18 # 不能直接定义变量
# 创建一个Person类的实例
person = Person("张三")
print(person.name)
print(person.age) # 错误
执行以上代码,输出结果为:
AttributeError: 'Person' object has no attribute 'age'
上面的例子中,Python解释器输出错误信息“属性错误:“Person”对象没有属性“age””。其实函数“_init_()”的第一个参数 “self”指的就是实例本身,通过将self作为参数传入到类的构造方法中,我们才能访问该对象的属性或调用其他方法。
2、类中的方法
Python类中的方法,指的是在类中定义的函数,函数在类的内部称为成员方法,定义成员方法也很简单,例如:
动手练一练:
# 定义一个名为Person的类
class Person:
# 初始化函数(构造函数)
def __init__(self, name):
self.name = name # 将传入的参数赋值给类的属性name
def say(self): # 定义成员方法
print("你好!我是", self.name)
# 创建一个Person类的实例
person = Person("张三")
person.say()
执行以上代码,输出结果为:
你好!我是 张三
上面的例子中可以看出,在类中定义成员方法和定义函数基本类似。这里需要注意的是,成员方法一定要定义在类里面,并且第一个参数必须是“self”。
3、私有属性
前面的教程中可以看到,在构造函数中定义了属性,实例可以轻松地获取和修改属性的值。但是,有时候我们不希望属性被外部直接访问,这时候就要用私有属性。在Python中,所有使用两条下划线开头的属性都是私有属性,外部不能随便访问这个属性。例如:
动手练一练:
# 定义一个名为Person的类
class Person:
# 初始化函数(构造函数)
def __init__(self, name):
self.__name = name # 私有属性
def say(self): # 定义成员方法
print("你好!我是", self.__name)
# 创建一个Person类的实例
person = Person("张三")
person.say() # 输出 你好!我是 张三
print(person.__name) # 错误
执行以上代码,输出结果为:
你好!我是 张三
AttributeError: 'Person' object has no attribute '__name'
上面的例子中,Python解释器输出错误信息“属性错误:‘Person’对象没有属性‘__name’”。虽然我们在构造方法中给“__name”赋值了,但是在实例中并不能直接访问到“__name”这个私有属性。使用私有属性可以有效隐藏类的内部实现细节,避免外部直接修改属性值。这有助于维护代码的稳定性和安全性。例如:
动手练一练:
# 定义一个名为Person的类
class Person:
def __init__(self, name):
self.__name = name
self.__age = None
print("你好!我是", self.__name)
def show_age(self, age):
if not isinstance(age, int):
print("年龄必须是数字!")
return False
if age <=0 :
print("年龄必须大于0!")
return False
self.__age = age
print("我今年", self.__age, "岁了")
def say(self):
print("我今年也", self.__age, "岁了")
person = Person("张三") # 输出 你好!我是 张三
person.show_age("python") # 输出 年龄必须是数字!
person.show_age(-5) # 输出 年龄必须大于0!
person.show_age(18) # 输出 我今年 18 岁了
person.say() # 输出 我今年也 18 岁了
执行以上代码,输出结果为:
你好!我是 张三
年龄必须是数字!
年龄必须大于0!
我今年 18 岁了
我今年也 18 岁了
上面的例子中,“__age”是一个私有属性,实例化后只能通过“show_age()”方法间接设置年龄。在“show_age()”方法中,我们限制了“age”只能是整数“int”并且必须大于“0”,有效地限制了实例化后数据的内容,保证了“__age”数据的准确性。
4、私有方法
私有方法与私有属性类似,是指在类的内部使用,不希望被外部直接调用的方法。同样,我们可以使用双下划线“__”作为前缀来定义私有方法。私有方法只能在类的内部调用,无法通过实例对象直接调用。例如:
动手练一练:
# 定义一个名为Person的类
class Person:
def __call(self, name):
print(name)
def say(self):
self.__call("你好!")
person = Person()
person.say() # 输出 你好!
person.__call() # 错误
执行以上代码,输出结果为:
你好!
AttributeError: 'Person' object has no attribute '__call'
上面的例子中,Python解释器输出错误信息“属性错误:‘Person’对象没有属性‘__call’”。虽然“say()”方法可以正常运行,但是“__call()”方法不能直接被实例“person”调用。使用私有方法可以将类的内部复杂逻辑封装起来,使外部调用更加简洁。私有方法一般用于内部计算、数据处理等,不需要被外部直接调用,有助于提高代码的可读性和维护性。