属性和方法-面向对象-python

1、基本概念

对象的含义是指具体的某一个事物,即在现实生活中能够看得见摸得着的事物。在面向对象程序设计中,对象所指的是计算机系统中的某一个成分。在面向对象程序设计中,对象包含两个含义,其中一个是数据,另外一个是动作。对象则是数据和动作的结合体。对象不仅能够进行操作,同时还能够及时记录下操作结果。

方法是指对象能够进行的操作,方法同时还有另外一个名称,叫做函数。方法是类中的定义函数,其具体的作用就是对对象进行描述操作。

继承简单地说就是一种层次模型,这种层次模型能够被重用。层次结构的上层具有通用性,但是下层结构则具有特殊性。在继承的过程中类则可以从最顶层的部分继承一些方法和变量。类除了可以继承以外同时还能够进行修改或者添加。通过这样的方式能够有效提高工作效率。在这里举一个例子,当类X继承了类Y后,此时的类X则是一个派生类,而类Y属于一个基类。 继承是从一般演绎到特殊的过程,可以减少知识表示的冗余内容,知识库的维护和修正都非常方便。更有利于衍生复杂的系统。

是具有相同特性(数据元素)和行为(功能)的对象的抽象。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。 [2] 类映射的每一个对象都具有这些数据和操作方法,类的继承具有层次性和结构性,高层次对象封装复杂行为,具体细节对该层次知识保持透明,可以减小问题求解的复杂度。

封装是将数据和代码捆绑到一起,对象的某些数据和代码可以是私有的,不能被外界访问,以此实现对数据和代码不同级别的访问权限。防止了程序相互依赖性而带来的变动影响,面向对象的封装比传统语言的封装更为清晰、更为有力。有效实现了两个目标:对数据和行为的包装和信息隐藏。

多态是指不同事物具有不同表现形式的能力。多态机制使具有不同内部结构的对象可以共享相同的外部接口,通过这种方式减少代码的复杂度。一个接口,多种方式。

动态绑定指的是将一个过程调用与相应代码链接起来的行为。动态绑定是指与给定的过程调用相关联的代码只有在运行期才可知的一种绑定,它是多态实现的具体形式。

消息传递:对象之间需要相互沟通,沟通的途径就是对象之间收发信息。消息内容包括接收消息的对象的标识,需要调用的函数的标识,以及必要的信息。消息传递的概念使得对现实世界的描述更容易。

面向对象的方法就是利用抽象、封装等机制,借助于对象、类、继承、消息传递等概念进行软件系统构造的软件开发方法。

上述内容摘自百度百科地址:https://baike.baidu.com/item/面向对象/2262089?fr=aladdin#3

一下所有讨论和代码基于python3.x。

2、属性

python中属性根据所属不同分为类属性和对象属性。

  • 类属性

    • 位置:和类中方法同级

    • 访问和修改:可以通过类名.或者对象.访问

  • 对象属性

    • 定义:通过初始化方法__init()__或者对象.属性赋值动态添加
    • 访问和修改:对象.属性访问和修改
  • 示例

    class Person:
        name = 'test01'
    
    
    p1 = Person()
    print(Person.name)
    print(p1.name)
    
    p2 = Person()
    print(Person.name)
    print(p2.name)
    p2.name = 'zhangsan'
    print(Person.name)
    print(p2.name)
    
    p1.age = 20
    print(Person.age)
    print(p1.age)
    
  • 解析:

    • 当访问一个对象的属性时,先查找对象是否有该属性,有直接访问;没有继续查找外层(类)中是否有该属性,有直接访问,没有报错;
    • 当给一个对象的属性赋值或者修改的时候,有直接赋值或者修改,没有会动态添加该属性。
    • 当类属性和对象属性同名的时候,优先访问对象属性。

关于实例化时属性对象赋值,在下面魔术方法中讲解。

3、方法

python中方法根据功能不同分为:魔术方法、普通方法、类方法和静态方法。

3.1、魔术方法

  • 格式

    def __方法名__(self[,参数])__
    
  • 常用魔术方法

魔术方法说明触发时机
_init_(self[,参数])实例化时初始化对象属性构造方法,创建完空间后调用的第1个方法
_str_(self[,参数])表示对象信息一个字符串打印对象时调用
  • 魔术方法(了解即可)
魔术方法说明触发时机
_new_(self[,参数])构建对象,开辟空间对象创建时
_del_(sefl[,参数])删除对象没有指针引用的时候
_call_(self[,参数])把对象当成函数用把对象当成函数用时
  • 示例

    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def __str__(self):
            return '我叫' + self.name + ", 今年:" + str(self.age) + " 岁"
    
    
    p1 = Person("zhangsan", 20)
    print('我叫' + p1.name + ", 今年:" + str(p1.age) + " 岁")
    p2 = Person("李四", 25)
    print(p2)
    
  • 解析

    • _str_:默认打印对象为一串内存地址,一般情况下对我们来说没有什么意义,而我们想要知道对象的一些详细信息,所以重写该方法;return是必须的。
    • _init_,它在对象初始化的时候调用,我们一般将它理解为"构造函数";在对象的生命周期结束时, __del__会被调用,可以将__del__理解为"析构函数"。

3.2、普通方法

类中定义的方法,也称对象方法或实例方法。

  • 格式

    def 方法名(self[,参数]):
    
  • 它最少也要包含一个 self 参数,用于绑定调用此方法的实例对象(Python 会自动完成绑定)

3.3、类方法

  • 格式

    @classmethod
    def 方法名(cls[,参数])
  • 它最少也要包含一个参数,只不过类方法中通常将其命名为 cls,Python 会自动将类本身绑定给 cls 参数

  • 类方法需要使用@classmethod修饰符进行修饰

  • 类方法推荐使用类名直接调用,当然也可以使用实例对象来调用(不推荐)

3.4、静态方法

  • 格式

    @staticmethod
    def 方法名([参数]):
    
  • 静态方法没有类似 self、cls 这样的特殊参数

  • 静态方法的调用,既可以使用类名,也可以使用类对象

3.5、对比

  • 实例方法与类方法和静态方法对比

    • 前者无需@装饰器修饰,后2者需要指定的@装饰器修饰
    • 前期通过对象调用;后者可以通过类名直接调用
    • 后2者在实际编程中很少使用,只在一些特殊场景使用
  • 类方法和静态方法对比

    • 类方法由@classmethod修饰;静态方法通过@staticmethod修饰
    • 类方法至少包含cls参数;静态方法没有self或者cls等特殊参数
  • 属性访问

    • 类中方法只能使用类属性;实例方法只能使用对象属性;静态方法可以通过类名显示的使用类属性
  • 方法访问

    • 实例方法之间可以相互调用
    • 普通方法可以通过类名显示调用类方法或者静态方法
    • 类方法、静态方法不能调用实例方法
    • 类方法和静态方法可以通过类名显示相互调用
  • 示例

    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def run(self):
            print(self.name + "在跑步..")
            Person.test01()
    
        @classmethod
        def test01(cls):
            print("类方法---", cls)
            Person.test02()
    
        @staticmethod
        def test02():
            print("静态方法")
            # Person.test01()
    
    
    p1 = Person('小明', 15)
    p1.run()
    p1.test01()
    p1.test02()
    

4、私有化

普通属性外界可以随意访问,很不安全,所以我们需要进行封装。

  • 步骤

    1. 私有化
      • 属性前加__即为私有化
    2. 定义公有的set和get方法
      • @peoperty装饰器
      • @xxx.setter装饰器
      • 由先后顺序
  • 优点

    • 隐藏属性不被外界随意修改
    • 需要修改的情况下,通过函数修改
  • 示例

    class Student:
        def __init__(self, name, age):
            self.name = name
            self.__age = age
    
        @property
        def age(self):
            return self.__age
    
        @age.setter
        def age(self, age):
            self.__age = age
    
        def __str__(self):
            return '我叫{},今年{}岁'.format(self.name, self.__age)
    
    
    s1 = Student('小明', 20)
    print(s1.__dir__())
    print(s1)
    s1.age = 25
    print(s1)
    
  • 属性封装之后可以通过对象.属性的方式直接访问

参考文章视频:

源代码仓库地址:https://gitee.com/gaogzhen/python-study

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 魔术方法Python中的特殊方法,它们以双下划线开头和结尾,例如__init__、__str__、__add__等。这些方法可以在类的实例化、运算符重载、属性访问等方面提供特殊的行为。 __init__方法是一个特殊的构造函数,用于初始化类的实例。__str__方法用于返回对象的字符串表示形式,可以通过print函数输出。__add__方法用于重载加法运算符,可以实现自定义的加法操作。其他常用的魔术方法还包括__eq__、__lt__、__gt__等,用于比较运算符的重载。 学习魔术方法可以让我们更好地理解Python面向对象编程的特性,提高代码的可读性和可维护性。 ### 回答2: 魔术方法Python中最有趣且也是最强大的概念之一。魔术方法(也称为特殊方法或双下划线方法)是一些特殊的方法,它们以双下划线(__)开头和结尾,并具有特定的名称。 这些特殊方法可以为我们提供许多有用的功能,例如重载操作符,处理类的属性,实现自定义迭代器,使用描述符等。 下面是一些常见的魔术方法: __init__:这是最常见的魔术方法。当创建一个实例时,它会被自动调用。它用于初始化对象的属性。 __str__:当你想要将一个对象转换成字符串时,这个方法会被调用。如果你不指定__str__方法Python默认会使用对象的类名和内存地址来表示对象。 __repr__:这个方法和__str__方法类似,也是用于将对象转换成字符串。但是__repr__方法在调试时有很大的作用,因为它返回的字符串可以用来唯一地标识对象。 __len__:这个方法可以返回对象的长度。例如,如果你想获取一个字符串的长度,你可以使用len("hello"),在底层,它实际上是调用了字符串对象的__len__方法。 __getattr__和__setattr__:这些方法允许你动态地获取和设置对象的属性。当你访问一个不存在的属性时,__getattr__方法会被调用。当你设置一个属性时,__setattr__方法会被调用。 __call__:这个方法允许你将对象作为函数调用。当你调用一个对象时,Python实际上是在调用对象的__call__方法。 除了上面列举的方法,还有许多其他的魔术方法,例如__cmp__,__hash__,__iter__等等。学习这些魔术方法将使你能够更好地理解Python面向对象编程模型。 总之,学习和理解魔术方法Python面向对象编程中的一个关键概念,因为它们可以帮助你实现更加灵活和强大的代码。如果你想成为一名Python高手,那么深入学习魔术方法是不可避免的。 ### 回答3: Python中的“魔术方法”指的是每个类中定义的特殊方法,它们以双下划线(__)开头和结尾,并且有着特定的用途。通过使用这些魔法方法,我们可以自定义类的行为,并为程序提供更高级别的功能。 以下是Python中常用的一些魔术方法: 1. __init__:这是最常用的魔术方法之一,它用于初始化一个类的对象,以及定义类的属性方法。 2. __str__:此方法用于返回对象的字符串表示形式,类似于Java中的toString()方法。 3. __repr__:与__str__类似,但是返回的是对象的“官方”字符串表示形式,通常用于调试和开发。 4. __getattr__:当试图访问一个不存在的属性时,此方法被调用。 5. __setattr__:当尝试设置类的属性时,此方法被调用。 6. __delattr__:当尝试删除类的属性时,此方法被调用。 7. __call__:将对象作为函数调用时,此方法被调用。 8. __len__:返回对象的长度。 9. __getitem__:允许通过索引访问对象的元素。 10. __setitem__:允许通过索引设置对象的元素。 11. __delitem__:允许通过索引删除对象的元素。 通过了解和使用这些魔术方法,我们可以编写出更高效、更灵活、更具可读性的Python代码,并且实现类似于内置类型一样的功能。例如,我们可以实现一个自定义列表,类似于Python的list类型,然后使用上述魔术方法来访问、设置和删除元素。同时,我们还可以自定义变量和函数的行为,使我们的Python代码变得更具有表现力和弹性。 总之,了解和掌握Python的魔术方法Python编程中必不可少的一部分,对于理解和编写实际应用程序非常有价值。在实践中,我们可以根据实际情况选择恰当的魔术方法,从而创建更灵活、更高效的Python类。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gaog2zh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值