一、属性

对象的属性(attribute)也叫做数据成员(data member)。

如果想指向某个对象的属性,可以使用格式:

  object.attribute

属性又分为:私有属性和公有属性。

私有属性是以两个下划线开头(__),私有成员在类的外部不能直接访问。

Python提供了一种特殊方式来访问私有成员:

  对象名._类名__私有属性名 (对象名是类实例后的对象)

公有属性既可以在类的内部进行访问,也可以在外部程序中使用。

Python还有一类比较特殊的内置属性,如:__doc__、__module__、__base__。

二、方法

方法是在类中定义的函数。

类的方法和普通的函数只有一个区别:

它们必须有一个额外的放在最前面的参数,通常都是把它命名为self。

但self并不是Python的关键字,如果把它换成其它的标识符也是可以正常执行的。

类的内置方法:开头与结尾都是两个下划线。

__init__(self):类的构造方法,当创建一个类的实例时,会自动调用该方法。

__del__(self):类的析构方法,销毁对象时,会自动执行。

__str__(self):用来设置对象以字符串类型出现时如何显示。

  1. # ---------------------------
    # 属性和方法
    # ---------------------------
    # 定义类
    class ProjectGroup:
    """这是一个项目组的类"""
    group_number = 0 # 类的属性(类变量)

    # 类的构造方法,创建实例时会被调用
    def __init__(self, project_name=None, members=None, dev_time=None):
    self.project_name = project_name # 对象的属性(实例变量)
    self.members = members # 公有属性,在类的外部可以通过对象进行访问 -- 项目成员
    self.__dev_time = dev_time # 私有属性,在类的外部不能直接访问 -- 项目周期
    ProjectGroup.group_number += 1

    # 析构方法,删除类对象(使用del语句删除类实例)时自动执行
    def __del__(self):
    ProjectGroup.group_number -= 1
    print("Destroy!")

    def __str__(self): # 内置函数,用来设置对象以字符串类型出现时如何显示
    return self.project_name

    def print_members(self):
    print(self.members)

    def get_dev_time(self):
    return self.__dev_time # 通过公有成员方法访问私有成员变量

    def set_dev_time(self, dev_time):
    self.__dev_time = dev_time

    def __mod_budget(self, budget): # 私有方法,只能在类内访问
    self.budget = budget
    print("设置项目预算:", self.budget)

    def set_budget(self, budget):
    self.__mod_budget(budget) # 调用私有方法

    @classmethod # 修饰器,声明类方法
    def class_get_number(cls): # 类方法,不能访问实例变量
    print("class method:", cls.group_number) # cls表示该类自身,在外部调用时不需要传值

    @staticmethod # 修饰器,声明静态方法
    def static_get_number(): # 静态方法
    print("static method:", ProjectGroup.group_number) # 同样不能访问实例变量
    # print("static method方法:", ProjectGroup.project_name) #打印出错,不能访问实例变量(类方法成员的变量)

    # 实例化生成一个对象
    project_group1 = ProjectGroup("RFID项目组")
    # 在类的外部,访问对象的公有属性
    project_group1.members = ['周小军', '张文静', '陈涛', '孙翔']
    # 访问类的属性(通过类名或对象名访问)
    print("当前项目组的数量:", ProjectGroup.group_number)
    print("使用对象访问时的数量:",project_group1.group_number)

    print("当前项目组的名称:",project_group1)

    # 通过公有成员方法设置私有成员变量的值
    project_group1.set_dev_time(90)
    print("项目的开发周期为:{}天".format(project_group1._ProjectGroup__dev_time))

    # 通过公有方法调用私有方法,设置项目预算为20万
    project_group1.set_budget(200000)

    # 通过类名/对象调用类方法
    ProjectGroup.class_get_number()
    # 通过对象/类名调用静态方法
    project_group1.static_get_number()

    # 再实例化一个对象
    project_group2 = ProjectGroup("数据交换项目组", ['刘晓', '卢茜', '耿超'], 120)
    print("group_number2数量:", ProjectGroup.group_number)

    # 删除对象,自动执行析构方法
    project_group3 = ProjectGroup()
    print("group_number:", ProjectGroup.group_number)
    project_group4 = ProjectGroup() #每创建一个实例化的对象,group_number都会加1
    print("group_number数量:", ProjectGroup.group_number)
    del project_group3
    print("group_number:", ProjectGroup.group_number)

    # 类的内置属性
    # 返回该类的文档字符串
    print("ProjectGroup.__doc__:", ProjectGroup.__doc__)

    # 返回创建此对象所用的类名称
    print(project_group1.__class__)
    print(project_group2.__class__)

    # 以字典的形式返回对象的属性和属性值(不包括类的属性)
    print(project_group1.__dict__)
    print(project_group2.__dict__)

    # 返回包含此类的模块名称
    print(ProjectGroup.__module__)

    # 返回该类的所有父类名称(只返回上一级父类)也叫基类
    print(ProjectGroup.__bases__)

    # 返回当前模块的名字
    print("当前模块的名字:", __name__)

python -- 面向对象编程(属性、方法)的更多相关文章

  1. Python - 面向对象编程 - MRO 方法搜索顺序

    为什么会讲 MRO? 在讲多继承的时候:https://www.cnblogs.com/poloyy/p/15224912.html 有讲到, 当继承的多个父类拥有同名属性.方法,子类对象调用该属性. ...

  2. Python - 面向对象编程 - 魔术方法(双下划线方法)

    什么是魔术方法 在Python中,所有以 __ 双下划线包起来的方法,都统称为 Magic Method 魔术方法,也叫双下划线方法 有哪些重要的魔术方法? __new__ https://www.c ...

  3. Python - 面向对象编程 - 子类方法的重写

    继承的详解 https://www.cnblogs.com/poloyy/p/15216652.html 方法的重写 在子类继承父类时,子类会拥有父类的所有属性和方法 但当父类的方法实现不满足子类需要 ...

  4. python面向对象基础-属性/方法

  5. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

  6. python 面向对象编程(一)

    一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...

  7. Python面向对象编程指南

    Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...

  8. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

  9. Python面向对象编程(下)

    本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...

随机推荐

  1. 用NVIDIA-TensorRT构造深度神经网络

    用NVIDIA-TensorRT构造深度神经网络 Deploying Deep Neural Networks with NVIDIA TensorRT NVIDIA TensorRT是一个用于生产环 ...

  2. Java面试必知必会(扩展)——Java基础

    float f=3.4;是否正确? 不正确 3.4是双精度,将双精度赋值给浮点型属于向下转型,会造成精度损失: 因此需要强制类型转换: 方式一:float f=(float)3.4 方式二:float ...

  3. Web打印插件实现思路(C#/Winform)

    最近,客户有个需求过来,Web端无预览打印,美其名曰:快捷打印. 当时第一反应就是找插件,拿来主义永远不过时.找了一圈发现,免费的有限制,没限制的需要收费(LODOP真的好用).说来就是一个简单的无预 ...

  4. SpringBoot2 参数管理实践,入参出参与校验

    一.参数管理 在编程系统中,为了能写出良好的代码,会根据是各种设计模式.原则.约束等去规范代码,从而提高代码的可读性.复用性.可修改,实际上个人觉得,如果写出的代码很好,即别人修改也无法破坏原作者的思 ...

  5. csp-s模拟测试「9.14」A·B·C(三分,贪心)

    博客大概咕了很久了......... T1 A 大概推下式子就好了,考试时数据点分治DFS前30点T了,然后后70分因为两数相乘爆long long然后本来可以A掉,就WA零了....... 式子推出 ...

  6. js笔记14

    1.作用域面试题 画图分析 2.DOM document object model 节点树状图 document>documentElement>body>tagname 3.我们常 ...

  7. excel VBA构造函数就是这么简单

    Function test(a As Integer)'构造函数名字为test参数为a且为int型  If a >= 90 Then     Debug.Print "优秀" ...

  8. Simpleperf分析之Android系统篇

    [译]Simpleperf分析之Android系统篇 译者按: Simpleperf是用于Native的CPU性能分析工具,主要用来分析代码执行耗时.本文是主文档的一部分,系统篇. 原文见aosp仓库 ...

  9. kubernetes关闭基于角色的访问控制-匿名访问

    1.关闭基于角色的访问控制 如果正在使用一个带有RBAC机制的Kubernetes集群,服务账户可能不会被授权访问API服务器(或只有部分授权).目前最简单的方式就是运行下面的命令查询API服务器,从 ...

  10. 台达PLC开发笔记(二):台达PLC设置主机通讯参数为RTU并成功通讯

    前言   前面使用485和网口与台达成功建立通讯,但是485是使用用的ASICC模式,多数情况下是使用RTU模式提升通讯效率.   下载安装台达ISPSoft软件   官网下载地址:https://d ...