Python面向对象中类的属性和方法(第3节)


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”调用。使用私有方法可以将类的内部复杂逻辑封装起来,使外部调用更加简洁。私有方法一般用于内部计算、数据处理等,不需要被外部直接调用,有助于提高代码的可读性和维护性。