知识点:

  • 类属性与实例属性;
  • 类方法与实例方法;
  • 静态方法;

类属性与实例属性

类属性与实例属性的区别

  • 属性的绑定不同

    • 类属性与当前类相关(绑定的是当前类),与当前类创建的任何对象无关;
    • 实例属性与当前对象相关(绑定的是当前对象);
  • 访问方式不同

    • 对于类属性,可以通过类名,进行访问,也可以通过对象进行访问。但是,通过对象进行访问,属于“只读访问”,我们不能对其进行修改;
    • 对于实例属性,只能通过创建的对象,进行访问,不能通过类名进行访问;

什么时候定义类属性?什么时候定义实例属性呢?

  • ① 定义类属性

不同对象都一致(完全一样)的属性,定义为"类属性",被大家共享。像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 :静态方法最好通过类名去访问,虽然对象也可以访问;

最新文章

  1. Partitioning & Archiving tables in SQL Server (Part 2: Split, Merge and Switch partitions)
  2. WPF依赖属性详解
  3. JQ弹出框移动-插件分享~~~
  4. 三点经验:长时间运行函数需要随时发射信号报告进度,以及设置bool变量随时可以退出,每做一步操作必须及时记录和处理相关信息
  5. Codeforces 417E Square Table(随机算法)
  6. 搜狐畅游:每月给员工直系长辈2000元爱孝薪_企业新闻_265G产业频道
  7. Hibernate各保存方法之间的差 (save,persist,update,saveOrUpdte,merge,flush,lock)等一下
  8. iOS回顾笔记(03) -- 自定义View的封装和xib文件的使用详解
  9. ASP.NET Core Razor中处理Ajax请求
  10. 笨办法39字典dict
  11. 使用Excel过滤重复数据
  12. PHP画矩形,椭圆,圆,画椭圆弧 ,饼状图
  13. Mysql的变量一览
  14. Tests of the Equality of Two Means
  15. 解决keepalived脑裂问题
  16. jdbi
  17. 高性能JavaScript(加载和执行)
  18. 半导体热阻问题深度解析(Tc,Ta,Tj,Pc)
  19. 过滤器中处理multipart/form-data头部的post请求request.getParameter(")获取不到参数问题
  20. mysql查询常用小语句

热门文章

  1. fetch & form-data & upload & image file
  2. 软件工程中的CI&CD
  3. Flutter: IntrinsicWidth类,将孩子的宽度调整为孩子的最大内在宽度
  4. golang官方嵌入文件到可执行程序
  5. Python数据结构与算法_回文数(03)
  6. 鸿蒙的js开发部模式16:鸿蒙布局Grid网格布局的应用一
  7. python进阶(1)Lambda表达式
  8. WPF 关于ComboBox在前台绑定XML数据的一些方法,使用XML数据提供器 XmlDataProvider
  9. 设置ViewPager 自动滑动时间,速度 方便展示动画
  10. 关于使用C3P0程序报错Having failed to acquire a resource, com.mchange.v2.resourcepool的问题