Python基础(二十):面向对象“类”第三课——类成员
知识点:
- 类属性与实例属性;
- 类方法与实例方法;
- 静态方法;
类属性与实例属性
类属性与实例属性的区别
属性的绑定不同
- 类属性与当前类相关(绑定的是当前类),与当前类创建的任何对象无关;
- 实例属性与当前对象相关(绑定的是当前对象);
访问方式不同
- 对于类属性,可以通过类名,进行访问,也可以通过对象进行访问。但是,通过对象进行访问,属于“只读访问”,我们不能对其进行修改;
- 对于实例属性,只能通过创建的对象,进行访问,不能通过类名进行访问;
什么时候定义类属性?什么时候定义实例属性呢?
- ① 定义类属性
不同对象都一致(完全一样)的属性,定义为"类属性",被大家共享。像desc = "人的描述",只有一个。
- ② 定义实例属性
不同对象都不一样的属性,定义为"实例属性",被个人独享。像name,age,不同对象一般是不同的。
再次提醒:实例属性定义在init方法中,是不同对象所独享;类属性定义在类中,能被不同对象共享。
下面来看一个案例:
class Person:
# 类属性
desc = "人的描述"
def __init__(self, name, age):
# 实例属性
self.name = name
self.age = age
p = Person("梁同学", 18)
访问类属性
强烈建议,类属性总是通过类名去访问。
① 通过类名
- 访问类属性(可以修改类属性)
- 修改类属性(可以修改成功)
② 通过对象
- 访问类属性(只能是只读模式访问,不能通过对象修改类属性)
- 修改类属性,修改时不会报错,但是并没有真正修改成功。
通过对象修改类属性,其实并不是修改类属性,而是动态地给对象p增加了一个属性desc,只不过这个属性名desc,和类属性desc,具有相同的名称而已。
访问实例属性
实例属性只能够通过,创建的对象,进行访问。
class Person:
# 类属性
desc = "人的描述"
def __init__(self, name, age):
# 实例属性
self.name = name
self.age = age
p = Person("梁同学", 18)
① 通过对象,访问实例属性
② 通过类名,访问实例属性,会报错
类属性与实例属性 知识总结
实例属性: 实例属性是对象独享的,每个对象都有自己的实例属性,彼此之间不受干扰。某个对象改变了自身的实例属性,对其他对象不会造成影响。
类属性: 类属性为类所有。由所有对象所共享(不属于任何对象)。一旦类属性发生了改变,会影响到所有对象。
类方法与实例方法
类方法与实例方法的相关解释
我们先来看一个例子:
class Person:
# 实例方法
def walk(self):
print("走路")
# 类方法,使用@classmethod修饰
# 类方法的第一个参数是固定的。根据惯例,将其命名为cls。但这也不是必须的。
@classmethod
def cm(cls):
# cls就是Person
print("这是类方法")
print(cls is Person)
p = Person()
观察上述例子,对于类方法,有下面几点需要注意:
- 注意1 :类方法,使用@classmethod修饰;
- 注意2 :类方法的第一个参数是固定的。根据惯例,将其命名为cls;
- 注意3 :cls就是Person;
- 注意4 :类方法的第一个参数会隐式传递,无需我们显式传递;
访问类方法
有两种方法可以访问类方法。但是强烈建议,类方法通过类名来访问。
① 通过类名访问类方法
② 通过对象访问类方法
访问实例方法
实例方法只能通过对象访问,而不能通过类名访问。
① 通过对象访问实例方法
② 通过类名访问实例方法,会报错
通过类名也不是不能访问实例访问,只是需要我们传入一个对象。尽管语法支持,但是不建议这样做。
实例方法与类方法 知识总结
实例方法 : 既可以通过对象调用实例方法,也可以通过类名调用实例方法。只不过通过类名调用实例方法,需要显示传递对象,画蛇添足,不建议这么做。
类方法 : 既可以通过类名调用类方法,也可以通过对象调用类方法。但是,强烈建议,通过类名调用类方法。
“类方法”与“实例方法”,对“类中属性”进行访问
最好,通过实例方法访问实例属性,通过类方法访问类属性。
class Person:
desc = "人的描述"
def __init__(self, name):
self.name = name
def walk(self):
# 实例方法访问实例属性
print(self.name + " is walking")
@classmethod
def c_m(cls):
# 尽管这种方式可以修改类属性。但是属于硬编码(表示代码写的太死了),不建议这么做
# Person.desc = "abcd" # 假如以后类名Person修改了,这里还需要修改
# 因为cls就是Person,所以可以用以下方式修改类属性
cls.desc = "abcd" # 以后就算是:类名Person修改了,这里也不用动。
p = Person("张三")
p1 = Person("李四")
结果如下:
静态方法
先来看一个例子:
class Person:
@staticmethod
def s_m():
print("这是静态方法")
# 因为没有self和cls。既不能访问类属性,也不能访问实例属性。但是有什么用呢?没多大作用,其实。不用太关心这个
p = Person()
结果如下:
通过上面的例子,关于静态方法需要注意以下几点:
- 注意1 :静态方法使用@staticmethod 修饰,也与所创建的对象无关;
- 注意2 :没有self和cls参数。不能访问类属性,也不能访问实例属性。但是有什么用呢?没多大作用;
- 注意3 :静态方法最好通过类名去访问,虽然对象也可以访问;
Python基础(二十):面向对象“类”第三课——类成员的更多相关文章
- Bootstrap <基础二十九>面板(Panels)
Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...
- Bootstrap <基础二十五>警告(Alerts)
警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...
- Bootstrap <基础二十八>列表组
列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 cl ...
- Bootstrap <基础二十六>进度条
Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet ...
- Bootstrap<基础二十四> 缩略图
Bootstrap 缩略图.大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 ...
- Bootstrap <基础二十二>超大屏幕(Jumbotron)
Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...
- Bootstrap<基础二十> 标签
Bootstrap 标签.标签可用于计数.提示或页面上其他的标记显示.使用 class .label 来显示标签,如下面的实例所示: <!DOCTYPE html> <html> ...
- Python 基础 二
Python 基础 二 今天对昨天学习的Python基础知识进行总结,学而不思则惘,思而不学则殆! 一.先对昨天学习的三大循环的使用情况进行总结: 1.while循环的本质就是让计算机在满足某一条件的 ...
- shell基础二十篇 一些笔记
shell基础二十篇 转自 http://bbs.chinaunix.net/thread-452942-1-1.html 研讨:Bash 内建命令 read (read命令更具体的说明见博客收藏的一 ...
随机推荐
- React 函数式组件的 Ref 和子组件访问(useImperativeHandle)
引入:如何调用函数式组件内部的方法 对于 React 中需要强制修改子组件的情况,React 提供了 Refs 这种解决办法,使得我们可以操作底层 DOM 元素或者自定的 class 组件实例.除此之 ...
- 2021-2-20:请你说说分布式系统 BASE 理论是什么?
BASE 理论是由 Dan Pritchett 在 ACM 上发表的一篇论文中提出的理论.是在 CAP 理论基础上提出的一种更实际的理论指导,和 PACELC 理论是有些相近的地方的. BASE 是指 ...
- [转]ROS 传感器消息及RVIZ可视化Laserscan和PointCloud
https://blog.csdn.net/yangziluomu/article/details/79576508 https://answers.ros.org/question/60239/ho ...
- AtCoder Regular Contest 113
比赛地址 A(暴力) 题目链接 题目: 给出\(K\),求出满足\(A\times B\times C\le K\)的\((A,B,C)\)对数 解析: 将C移动到等式右边,得到\(A\times B ...
- js中this指向的问题与联系
前言 JavaScript 中最大的一个安全问题,也是最令人困惑的一个问题,就是在某些情况下this的值是如何确定的.有js基础的同学面对这个问题基本可以想到:this的指向和函数调用的方式相关.这当 ...
- 微信小程序中input标签高度设置
如果没有设置高度所以显示的是控件自身的高度. 微信小程序input控件原始设置: 上图发现: 我只覆盖了官方input的height,而没有覆盖min-height; .query input{ bo ...
- (十二)数据库查询处理之Query Execution(1)
(十二)数据库查询处理之Query Execution(1) 1. 写在前面 这一大部分就是为了Lab3做准备的 每一个query plan都要实现一个next函数和一个init函数 对于next函数 ...
- 定西+简单dp
定西 ECNU-3531 #include<iostream> #include<cstdio> #include<algorithm> #include<c ...
- HDOJ-6681(离散化+线段树)
Rikka With Cake HDOJ-6681 最终的答案为射线的交点数加一.当然,我们也可以证明.证明需要用到欧拉公式 V−E+F=2 V-E+F=2V−E+F=2 .设射线的交点共 c cc ...
- MarkFormat,一个在Word中使用Mark进行格式化的插件
MarkFormat(标记格式化),是一款在Word中基于标记进行格式化的工具. 让我们看下具体效果. 首先是有标记的文本 点击格式化之后 点击去除标记之后(去除标记也会进行格式化) 如果想要恢复标记 ...