类属性

就像如下代码:

class Person:
name = "张三" # 共有类属性
__age = 18 # 私有类属性

在类中直接定义的属性就是类属性,它被所有的实例对象所共有

对于共有类属性,在类外可通过类对象和实例对象访问

例如:

class Person:
name = "张三" # 共有类属性
__age = 18 # 私有类属性 p = Person()
print(p.name) # 通过实例对象访问共有属性
print(Person.name) # 通过类对象访问共有属性
"""
输出结果:
张三
张三
"""

私有的类属性在类外不能被访问,否则会报异常。

实例属性

  • 在类中通过self.xxx或者实例对象.xxx定义的属性就是实例属性。
  • 每个实例属性仅在当前实例对象中有,若想要所有的实例对象有该实例属性,则需要在__init __初始化方法中定义该实例属性。

如下代码所示定义实例属性:

class Person:
def __init__(self):
self.name = "张三" # 定义实例属性 p = Person()
print(p.name)

或者

class Person:
pass p = Person()
p.name = "张三" # 定义实例属性
print(p.name)

通过类对象修改类属性的值

也许我们会想到通过实例对象去修改类属性的值,那么它是这样的:

class Person:
sex = "男"
def __init__(self):
self.sex = "女" p = Person()
print(p.sex)
print(Person.sex)
"""
输出结果:


"""

也可能是这样想的:

class Person:
sex = "男" p = Person()
p.sex = "女"
print(p.sex)
print(Person.sex)
"""
输出结果:


"""

本质上它们是一样的,并没有修改类属性的值,只是在当前的实例对象中添加了一个和类属性同名实例属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性。

只有通过类对象才能修改类属性的值

class Person:
sex = "男" Person.sex = "女"
print(Person.sex)
"""
输出结果:

"""

类方法

类对象拥有的方法就是类方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以'cls'作为第一个参数的名字,就最好用'cls'了),能够通过实例对象和类对象去访问。

class People(object):
country = 'china' #类方法,用classmethod来进行修饰
@classmethod
def getCountry(cls):
return cls.country p = People()
print(p.getCountry()) #可以用过实例对象引用
print(People.getCountry()) #可以通过类对象引用
"""
输出结果:
china
china
"""

类方法还有一个作用就是可以修改类属性:

class People(object):
country = 'china' #类方法,用classmethod来进行修饰
@classmethod
def getCountry(cls):
return cls.country @classmethod
def setCountry(cls,country):
cls.country = country p = People()
print(p.getCountry()) #可以用过实例对象引用
print(People.getCountry()) #可以通过类对象引用 p.setCountry('English') print(p.getCountry())
print(People.getCountry())
"""
输出结果:
china
china
English
English
"""

静态方法

如果一个方法传递的参数不是和实例属性有关,那么就可以把它定义成静态方法,需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数。

class People(object):
country = 'china' @staticmethod
def getCountry():
return People.country print (People.getCountry())

总结

从类方法和实例方法以及静态方法的定义形式就可以看出来,类方法的第一个参数是类对象cls,那么通过cls引用的必定是类对象的属性和方法;而实例方法的第一个参数是实例对象self,那么通过self引用的可能是类属性、也有可能是实例属性(这个需要具体分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性优先级更高。静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过类对象来引用。

python的类属性、实例属性、类方法、静态方法的更多相关文章

  1. python的类的 静态属性 类方法 静态方法

    一.静态属性 静态属性说的就是数据属性 1.定义一个房间的类,求下这个房间的面积 class Room: def __init__(self,name,ower,width,length,heigh) ...

  2. Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type())

    Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type()) 一丶类的结构细分    ...

  3. Python中类的声明,使用,属性,实例属性,计算属性及继承,重写

    Python中的类的定义以及使用: 类的定义: 定义类 在Python中,类的定义使用class关键字来实现 语法如下: class className: "类的注释" 类的实体 ...

  4. python基础——类和实例

    python基础——类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都 ...

  5. python - class类 (二) 静态属性/类方法/静态方法

    静态属性: #静态属性 = 数据属性 (@property) class mianji(): def __init__(self,x,y): self.x = x self.y = y #类的函数方法 ...

  6. Python - 001 - 类与实例间属性的理解

    Python是个很灵活的语言,光看它的类和实例间属性的访问机制就可以看出这一点,不过这一点还真的不好理解,做了些测试之后我的理解是这样的: 实例在访问class属性时,先检索自己的names, 如果有 ...

  7. Python类的实例属性详解

    实例属性 1.类被实例化后才会具有的属性 2.一般在_init_()方法中创建并初始化 3.直接使用即定义:self.<属性名> 4.引用方法:self.<属性名> 5.sel ...

  8. Python面向对象-类、实例的绑定属性、绑定方法和__slots__

    绑定属性 从之前的文章中,我们知道python是动态语言——实例可以绑定任意属性. 那如果实例绑定的属性和类的属性名一样的话,会是什么情况呢? >>> class Student(o ...

  9. python cookbook第三版学习笔记十二:类和对象(三)创建新的类或实例属性

    先介绍几个类中的应用__getattr__,__setattr__,__get__,__set__,__getattribute__,. __getattr__:当在类中找不到attribute的时候 ...

  10. python tips:类与实例的属性问题

    实例是具象化的类,它可以作为类访问所有静态绑定到类上的属性,包括类变量与方法,也可以作为实例访问动态绑定到实例上的属性. 实例1: class A: work = list("hello&q ...

随机推荐

  1. 「SCOI2015」小凸玩矩阵

    题目链接 问题分析 题目给了充足的暗示,我们只需要二分答案然后跑匈牙利即可.要相信匈牙利的速度 参考程序 #include <bits/stdc++.h> using namespace ...

  2. R_Studio(神经网络)BP神经网络算法预测销量的高低

    BP神经网络 百度百科:传送门 BP(back propagation)神经网络:一种按照误差逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络 #设置文件工作区间 setwd('D:\\ ...

  3. HTML jQuery 文档操作 - html() 方法

    jQuery 文档操作 - html() 方法 jQuery 文档操作参考手册 实例 设置所有 p 元素的内容: $(".btn1").click(function(){ $(&q ...

  4. 【nginx】 配置域名转发到相同地址不同端口下执行相应业务

    #doctor upstream doc { server 52.**.**.***:8090; } #patient upstream pat { server 52.**.**.***:8088; ...

  5. js中filter过滤用法总结

    定义和用法 filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素. 注意: filter() 不会对空数组进行检测. 注意: filter() 不会改变原始数组 ...

  6. 使用hash方法切割文件

    如果有大型数据文件(如每行为url或者ip或者单词等的),以G为单位的,处理的时候需先切分.普通切分方法直接根据数据条数切分,得到的每个文件大小相近. 但是有时需要将相同数据放到相同文件中.可以使用h ...

  7. python - lambda 函数使用

    # if we need it only once and it's quite simple def make_incrementor(n): return lambda x: x + n f = ...

  8. 利用开源SlidingMenu框架实现左右侧滑菜单的功能

    package com.loaderman.slidingmenudemo; import android.os.Bundle; import android.support.v4.app.Fragm ...

  9. 继成极光推送SDk的实现

    进入极光推送官网:https://www.jiguang.cn/push 注册,创建应用,申请APPKey等操作 代码实现: 确认android studio的 Project 根目录的主 gradl ...

  10. 【flask】表单-上传文件

    依赖: flask-wtf upload_case.html <!DOCTYPE html> <html lang="en"> <head> & ...