首页 > 编程语言 >[2]Python面向对象-【4】属性

[2]Python面向对象-【4】属性

时间:2023-04-06 10:14:29浏览次数:41  
标签:name Person Python age 面向对象 print self 属性

Python是一种面向对象的编程语言,因此属性是面向对象编程中的重要概念之一。在Python中,属性是与对象相关联的数据或函数,它们可用于描述对象的状态或行为。Python中的属性可以是实例属性或类属性。

实例属性

实例属性是与类的每个实例相关联的属性。这些属性通常在实例化时创建并设置。以下是一个示例类:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

在这个类中,每个实例都具有name和age属性。在实例化对象时,这些属性将被设置为提供的值。例如:

person1 = Person("Alice", 25)
person2 = Person("Bob", 30)
print(person1.name)  # 输出:Alice
print(person2.age)   # 输出:30

在这个例子中,person1的name属性被设置为"Alice",age属性被设置为25。同样,person2的name属性被设置为"Bob",age属性被设置为30。

类属性

类属性是与类本身相关联的属性。它们被所有类的实例共享。以下是一个示例类:

class Person:
    species = "Homo sapiens"
    
    def __init__(self, name, age):
        self.name = name
        self.age = age

在这个类中,每个实例都具有name和age属性,但是species属性是类属性。因此,所有Person实例共享相同的species属性。例如:

person1 = Person("Alice", 25)
person2 = Person("Bob", 30)
print(person1.species)  # 输出:Homo sapiens
print(person2.species)  # 输出:Homo sapiens

在这个例子中,person1和person2的species属性都是"Homo sapiens"。

类属性可以通过类本身或任何类的实例来访问和设置。例如:

Person.species = "Homo neanderthalensis"
print(person1.species)  # 输出:Homo neanderthalensis
print(person2.species)  # 输出:Homo neanderthalensis

person1.species = "Homo erectus"
print(person1.species)  # 输出:Homo erectus
print(person2.species)  # 输出:Homo neanderthalensis

在这个例子中,我们首先通过类本身将species属性设置为"Homo neanderthalensis",然后通过person1实例将其设置为"Homo erectus"。由于species属性是类属性,因此这个更改会影响所有Person实例,但是由于person1实例现在具有自己的`species`属性,因此仅会影响person1实例的species属性。

访问和设置属性

要访问属性,可以使用点运算符。例如,要访问person1的name属性:

print(person1.name)  # 输出:Alice

要设置属性,也可以使用点运算符。例如,要将person2的age属性设置为35:

person2.age = 35
print(person2.age)  # 输出:35

如果您想要在设置属性时添加一些逻辑或约束条件,可以使用属性装饰器。属性装饰器是一种特殊的装饰器,用于将方法转换为属性。以下是一个示例:

class Person:
    def __init__(self, name, age):
        self._name = name
        self._age = age
        
    @property
    def name(self):
        return self._name
    
    @name.setter
    def name(self, value):
        if not isinstance(value, str):
            raise ValueError("Name must be a string")
        self._name = value
    
    @property
    def age(self):
        return self._age
    
    @age.setter
    def age(self, value):
        if not isinstance(value, int):
            raise ValueError("Age must be an integer")
        if value < 0:
            raise ValueError("Age must be non-negative")
        self._age = value

在这个类中,name和age属性是用@property装饰器定义的。@property装饰器将方法转换为属性,使其在访问时看起来像一个普通属性。@name.setter和@age.setter装饰器定义了用于设置属性的方法。

在这个示例中,name属性只接受字符串值,而age属性只接受非负整数值。如果传递了无效的值,将会引发ValueError异常。

例如:

person = Person("Alice", 25)
person.name = "Bob"
person.age = 30
print(person.name)  # 输出:Bob
print(person.age)   # 输出:30

person.name = 100  # 引发ValueError异常
person.age = -5    # 引发ValueError异常

在这个示例中,我们首先实例化了一个Person对象,然后使用name和age属性设置对象的属性。我们还尝试将name属性设置为一个整数值和将age属性设置为一个负数值,这两种情况都会引发ValueError异常,因为它们违反了属性装饰器中定义的约束条件。

当你已经了解了Python中属性的基础概念之后,可以继续学习以下一些更高级的属性相关的概念和技术。

属性的继承

在Python中,子类可以继承父类的属性,并且可以添加新的属性或者重写父类的属性。当子类继承父类的属性时,它们将具有相同的名称和类型,但是它们的值可以不同。

以下是一个示例,展示了如何在子类中继承父类的属性:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
class Employee(Person):
    def __init__(self, name, age, employee_id):
        super().__init__(name, age)
        self.employee_id = employee_id
        
person = Person("Alice", 25)
employee = Employee("Bob", 35, 12345)

print(person.name, person.age)   # 输出:Alice 25
print(employee.name, employee.age, employee.employee_id)  # 输出:Bob 35 12345

在这个示例中,我们定义了一个Person类和一个Employee类。Employee类继承了Person类,并添加了一个名为employee_id的新属性。在Employee类的构造函数中,我们使用super()函数调用了父类的构造函数,以便将name和age属性初始化为相应的值。

静态属性和类方法

在Python中,静态属性是属于类而不是实例的属性。类方法是可以直接通过类名调用的方法。这两个概念在Python中经常一起使用,因为它们都是与类相关联的。

以下是一个示例,展示了如何定义静态属性和类方法:

class Person:
    count = 0
    
    def __init__(self, name, age):
        self.name = name
        self.age = age
        Person.count += 1
        
    @staticmethod
    def print_hello():
        print("Hello!")
        
    @classmethod
    def get_count(cls):
        return cls.count
        
person1 = Person("Alice", 25)
person2 = Person("Bob", 30)

Person.print_hello()   # 输出:Hello!
print(Person.get_count())  # 输出:2

在这个示例中,我们定义了一个Person类,其中包含一个静态属性count,用于记录创建的实例的数量。在__init__方法中,我们将count属性递增。我们还定义了一个静态方法print_hello,用于打印“Hello!”。最后,我们定义了一个类方法get_count,用于返回count属性的值。

在示例中,我们创建了两个Person实例,并通过Person类调用了静态方法和类方法。

属性的可见性

在Python中,没有明确的私有属性或私有方法的概念。但是,Python有一个命名约定,用于表示属性或方法应该被视为私有的。私有属性或方法的名称应该以一个或多个下划线开头,例如_name或__method。虽然这些属性或方法仍然可以从类的外部访问,但是这些名称的前导下划线可以防止它们被意外修改或使用。

另外,Python还有一个特殊的命名约定,用于表示属性或方法应该被视为受保护的。受保护的属性或方法的名称应该以一个下划线开头,例如_name或_method。虽然这些属性或方法也可以从类的外部访问,但是它们通常被视为只能被类及其子类使用的属性或方法。

以下是一个示例,展示了如何使用命名约定来表示私有和受保护的属性:

class Person:
    def __init__(self, name, age, email):
        self._name = name
        self._age = age
        self.email = email
        
    def _get_name(self):
        return self._name
        
    def get_age(self):
        return self._age
        
class Employee(Person):
    def __init__(self, name, age, email, employee_id):
        super().__init__(name, age, email)
        self.employee_id = employee_id
        
    def get_email(self):
        return self.email
        
person = Person("Alice", 25, "[email protected]")
employee = Employee("Bob", 35, "[email protected]", 12345)

print(person._name)   # 输出:Alice
print(person.get_age())  # 输出:25
print(employee._name)  # 输出:Bob
print(employee.get_age())  # 输出:35
print(employee.get_email())  # 输出:[email protected]

在这个示例中,我们定义了一个Person类和一个Employee类。在Person类的构造函数中,我们使用前导下划线来表示_name和_age属性应该被视为私有属性。我们还定义了一个名为_get_name的受保护方法,用于返回_name属性的值。

在Employee类的构造函数中,我们调用了父类的构造函数,并添加了一个名为employee_id的新属性。在Employee类中,我们可以从类的外部访问email属性,因为它没有使用前导下划线来表示私有属性。

属性的文档字符串

在Python中,属性可以有文档字符串,用于描述属性的用途、值的含义等。文档字符串应该在属性的定义下面,以三个引号开始和结束。以下是一个示例,展示了如何添加文档字符串:

class Person:
    """Represents a person with a name and an age."""
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    @property
    def name(self):
        """The person's name."""
        return self

在这个示例中,我们在name属性的定义下面添加了一个文档字符串,用于描述属性的含义。我们还使用了一个装饰器@property来定义name属性的getter方法。该装饰器允许我们像使用属性一样使用name方法。

总结

在Python中,属性是一种定义在类中的变量,它允许我们封装数据和逻辑,并控制对它们的访问。我们可以使用@property装饰器来定义getter和setter方法,或者使用property()函数来创建一个属性。属性可以有文档字符串,用于描述属性的用途和含义。此外,Python还有一些命名约定,用于表示属性或方法应该被视为私有的或受保护的。

标签:name,Person,Python,age,面向对象,print,self,属性
From: https://blog.51cto.com/jzj2023/6172256

相关文章

  • [oeasy]python0128_unicode_字符集_character_set_八卦_星座
    unicode回忆上次内容中国的简体和繁体汉字字符数量都超级大彼此还认对方为乱码 如果有一种编码所有的字符都能编进去就好了中日韩(CJK)欧洲拼音梵文阿拉伯文卢恩字符等等等都包括进去 ​ 添加图片注释,不超过1......
  • Python三目运算
    Python的赋值语句,有一种带条件判断的语法,将赋值和条件判断融为一行代码,使需要条件判断的赋值代码写起来更加简练高效,与Java语言中的三元表达式?:语法一样。>>>a=123ifTrueelse321>>>a123>>>a=123ifFalseelse321>>>a321以上代码,给变量a赋值,如果if......
  • Python四种常用的高阶函数,你会用了吗
    ​每天进步一点点,关注我们哦,每天分享测试技术文章本文章出自【码同学软件测试】码同学公众号:自动化软件测试,领取资料可加:Matongxue_10码同学抖音号:小码哥聊软件测试 1、什么是高阶函数把函数作为参数传入,这样的函数称为高阶函数例如: def func1(x,y,f):   return......
  • 全网最详细中英文ChatGPT-GPT-4示例文档-会议笔记文档智能转摘要从0到1快速入门——官
    目录Introduce简介setting设置Prompt提示Sampleresponse回复样本APIrequest接口请求python接口请求示例node.js接口请求示例curl命令示例json格式示例其它资料下载ChatGPT是目前最先进的AI聊天机器人,它能够理解图片和文字,生成流畅和有趣的回答。如果你想跟上AI时代的潮流......
  • Python小练习:处理字符串
    Python小练习:处理字符串作者:凯鲁嘎吉-博客园 http://www.cnblogs.com/kailugaji/介绍两种处理字符串的方式:1.将英语名词单数转化为复数形式(仅适用于一般形式),2.将字符串(带有下换线_)转化为驼峰化形式。1.word_test.py1#-*-coding:utf-8-*-2#Author:凯鲁嘎吉......
  • 一步步制作下棋机器人之 coppeliasim进行Scara机械臂仿真与python控制
    稚晖君又发布了新的机器人,很是强大。在编写时看到了稚晖君的招聘信息,好想去试试啊!小时候都有一个科幻梦,如今的职业也算与梦想有些沾边了。但看到稚晖君这种闪着光芒的作品,还是很是羡慕。以前就想做一个机械臂,实现远程象棋对战等功能,看到稚晖君的作品,更加心动了。心动不如行动,下......
  • Python 开发环境安装
    大家都已经熟悉的语言,python,我这也开始熟悉下如何使用。当前开发环境安装。打开官网,通过迅雷等下载工具下载相应的python安装包。但由于各种包也有要求系统当前环境,比如新的包,要求必须是win8以上。。当前我系统是win7就无法使用,只能使用一个几年前的版本。官网下载中心,根据操作......
  • python基础七(函数名称空间及作用域、函数对象、函数嵌套、闭包函数、装饰器)
    一名称空间(namespaces):存放名字的地方,是对栈区的划分。 有了名称空间之后,就可以在栈区中存放相同的名字,详细的名称空间。分三种1.1内建名称空间存放的名字:存放的python解释器内置的名字print<built-infunctionprint>存活周期:python解释器启动则产生,python解释器关闭则销毁......
  • 20230405-Python运算符-day3
    运算符4月4日算数运算符赋值运算符复合赋值运算符⽐较运算符逻辑运算符算数运算符符号描述实例+加print(1+1)输出结果为2-减print(1-1)输出结果为0*乘print(2*2)输出结果为4/除print(4/2)输出结果为2//整除print(9//4)输出结果......
  • 方法定义,Date和JSON对象,及JavaScript式面向对象编程
    一.方法1.方法的定义 方法就是把函数放在对象里面,对象有两个东西:属性和方法通过对象名.方法名()使用a.第一种方法定义<script>varsetFun={name:"maming",birth:2002,//方法:被包含在对象之中age:function(){varnow=ne......