#3 Python面向对象(二)

前言

上一节主要记录面向对象编程的思想以及Python类的简单创建,这节继续深入类中变量的相关知识,Here we go!

Python中类的各种变量

1.1 类变量

类变量定义:在类中,在函数体(方法)外的变量称为类变量。类变量在整个类中是公用的

类变量初始化:按照以上定义,类变量的初始化如下

1 class Doctor:
2     ‘‘‘
3     类变量的初始化
4     ‘‘‘
5     salary = 100  # salary为类变量
6
7     def talk():
8         print(‘I am a doctor‘)

类变量访问:因为类变量在整个类中是公用的,所以在不同的环境下都能访问。在类中函数体外直接使用 类变量 访问;在类中函数体内使用 类.类变量 或者 实例.类变量 访问;在类外使用 类.类变量 或者 实例.类变量访问

class Doctor:
    ‘‘‘
    在类中函数体外访问类变量salary
    ‘‘‘
    salary = 100
    print(salary)

    def talk(self):
        print(‘I am a doctor‘)

lisi = Doctor()   # 一旦实例化后,就会自动按顺序执行类中函数体外的代码

# 运行结果:
100
class Doctor:
    ‘‘‘
    在类中函数体内访问类变量salary
    ‘‘‘
    salary = 100

    def talk0(self):
        ‘‘‘
        使用类.类变量访问
        ‘‘‘
        print(‘My salary is {0}‘.format(Doctor.salary))

    def talk1(self):
        ‘‘‘
        使用实例.类变量访问
        ‘‘‘
        print(‘My salary is {0}‘.format(self.salary))

lisi = Doctor()

lisi.talk0()
lisi.talk1()

# 运行结果:
My salary is 100
My salary is 100
class Doctor:
    ‘‘‘
    在类外访问类变量salary
    ‘‘‘
    salary = 100

    def talk(self):
        print(‘I am a doctor‘)

lisi = Doctor()
print(Doctor.salary)  # 使用 类.类变量 访问
print(lisi.salary)   # 使用 实例.类变量 访问

# 运行结果:
100
100

1.2 实例变量

实例变量定义:在类中,在函数体(方法)内的变量称为实例变量。

实例变量初始化:按照上面定义,实例变量的初始化如下

1 class Doctor:
2     ‘‘‘
3     初始化实例变量
4     ‘‘‘
5
6     def talk(self):
7         self.sentence = ‘I am man‘    # self.sentence 为实例变量

实例变量访问:实例变量在整个类中并不是公用的,所以其访问范围有限。在类中函数体内使用 实例.实例变量 访问;在类外使用 实例.实例变量 访问

class Doctor:
    ‘‘‘
    类中函数体内的访问
    ‘‘‘

    def talk(self):
        self.sentence = ‘I am man‘    # 初始化实例变量self.sentence
        print(self.sentence)   # 访问实例变量

lisi = Doctor()

lisi.talk()  # 调用talk方法

# 运行结果:
I am man
class Doctor:
    ‘‘‘
    类外访问实例变量
    ‘‘‘

    def talk(self):
        self.sentence = ‘I am man‘    # 初始化实例变量self.sentence

lisi = Doctor()

lisi.talk()  # 必须先执行talk方法才能访问talk方法里面的实例变量
print(lisi.sentence)  # 类外访问实例变量

1.3 类变量、实例变量与全局变量、局部变量的异同点

在Python基础教程中讲解了全局变量与局部变量的相关知识,本节提到的两个变量与它们有什么异同呢?

  • 绝对来说,类变量与实例变量都是局部变量
  • 相对来说,在类中,类变量相当于全局变量,但实例变量并不相当于局部变量,更不相当于全局变量
  • 相对来说,在实例中,类变量和实例变量都相当于全局变量
  • 相对来说,在类中的方法里,才有局部变量,初始化的时候不是定义 实例.实例变量 ,而是直接定义 变量

一下子说的这么复杂难以理解,举个栗子??就明白了:

class Doctor:
    salary = 100

    def talk(self):
    ¦   print(‘I am a doctor‘)

print(salary)

# salary是Doctor的类变量,在类中定义
# 但在主程序中并不能被正确访问
# 因为salary变量是局部变量

# 运行结果:
Traceback (most recent call last):
  File "8.py", line 8, in <module>
    print(salary)
NameError: name ‘salary‘ is not defined

# 抛出变量未定义异常
class Doctor:
    def talk(self):
        self.salary = 100

print(salary)

# 同样,实例变量self.salary也是局部变量

# 运行结果:
Traceback (most recent call last):
  File "9.py", line 6, in <module>
    print(salary)
NameError: name ‘salary‘ is not defined

# 抛出变量未定义异常
class Doctor:
    def talk(self):
        self.salary = 100

Doctor().talk()
print(salary)

# 即使执行了talk方法,也不能正确访问
# 因为它至始至终都是局部变量

# 运行结果:
Traceback (most recent call last):
  File "9.py", line 12, in <module>
    print(salary)
NameError: name ‘salary‘ is not defined
class Doctor:
    salary = 100
    print(salary)

    def talk(self):
        print(Doctor.salary)

    def eat(self):
        print(Doctor.salary)

lisi = Doctor()
lisi.talk()
lisi.eat()

# 因为类变量在整个类中都是共有的
# 因此类变量能被类中的方法访问
# 换句话说,在类中类变量相当于全局变量

# 运行结果:

100
  100
  100

class Doctor:
    salary = 100
    print(salary)

    def talk(self):
        self.food = ‘BaoZi‘
        print(Doctor.salary)
        print(self.food)

    def eat(self):
        print(Doctor.salary)
        print(self.food)

lisi = Doctor()
lisi.talk()
lisi.eat()

# 在talk方法里面定义实例变量self.food
# 但是在eat方法里面却可以访问self.food这个实例变量
#(前提是必须先运行talk方法,就相当于初始化self.food)
# 因此,在实例中,类变量和实例变量都相当于全局变量

# 运行结果:

100
  100
  BaoZi
  100
  BaoZi

class Doctor:

    def talk(self):
        salary = 100
        print(salary)

    def eat(self):
        print(salary)

lisi = Doctor()
lisi.talk()
lisi.eat()

# 在类中talk方法里定义局部变量salary
# 在其他方法中是不能被访问的

# 运行结果:
100
Traceback (most recent call last):
  File "12.py", line 13, in <module>
    lisi.eat()
  File "12.py", line 8, in eat
    print(salary)
NameError: name ‘salary‘ is not defined

1.4 类变量和实例变量注意事项

「类变量在类中函数体内有两种访问方式: 类.类变量 和 实例.类变量 ,这两种方式会带来不同的后果。使用 实例.类变量 访问类变量后,其实是重新创建了一个新的实例变量: 实例.实例变量 ,与类变量已经无关了」

class Doctor:
    salary = 100  # 初始化类变量salary

    def talk0(self):
        print(‘talk0:‘, Doctor.salary)
        Doctor.salary = 200   # 修改类变量salary的值为200

    def talk1(self):
        print(‘talk1:‘, Doctor.salary)
        print(‘talk1:‘, self.salary)
        self.salary = 300   # 修改self.salary的值为300

    def talk2(self):
        print(‘talk2:‘, self.salary)
        print(‘talk2:‘, Doctor.salary)  # 输出的类变量并没有被改变为300

lisi = Doctor()

lisi.talk0()
lisi.talk1()
lisi.talk2()

# 运行结果:
talk0: 100
talk1: 200
talk1: 200
talk2: 300
talk2: 200

强烈建议:类变量的访问方法用 类.类变量

小结

本小节介绍了Python中类的各种变量知识,在实际使用中要有深刻的理解才行。之后会记录类的传参、类的性质、类的属性方法等,拜拜~~

原文地址:https://www.cnblogs.com/minutesheep/p/10416283.html

时间: 2024-10-16 03:58:42

#3 Python面向对象(二)的相关文章

python面向对象二

1.1类的静态属性,类方法,类的静态方法 1.1.1静态属性(@property) 在类中: python内置的@property装饰器就是负责把一个方法(函数)变成属性来调用. class Student: def __init__(self,name,age,score): self.name = name self.age = age self.score = score @property def get_score(self): return self.score def learn(

python面向对象(二)

类的成员 类的成员可以分为三大类:字段.方法和属性 一.字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 普通字段属于对象 静态字段属于类 class foo: # 字段(静态字段,保存在类里) cc = '111' def __init__(self): # 字段(普通的字段,保存在对象里) self.name = 'mxz' def f1(self): print(self.name) class Province: # 静态字段 cou

Python 面向对象 二

通过此方法communicate  管道 日志模块logging python单独提供 re.split(规则,字符串,1)以第一个符合规则的进行分割. random 模块 将数字转换为字母char(65) = A __init__:构造方法,实例化的时候执行 经典类: 如: class N: pass 新式类: 如: class M(object): pass 一个类不管直接或间接的继承object类就是新式类.推荐使用新式类 两者区别: 继承:java.C# 不支持多继承,python 支持

Python 面向对象(二) 特殊方法

一些Python特殊方法的汇总 __bases__              类的基类,返回元祖__base__                类的基类,也叫父类__call__                  '类名()',类名加括号调用时执行的语句__class__               表示当前操作的对象的类是什么__del__                   析构方法,对象在内存中被释放时,自动触发执行__dict__                  存储类或实例的所有属性

四十一、python面向对象二

A.成员: 1.字段:静态字段(每个对象都有同一字段),普通字典(每个对象都有不同的数据) 2.方法:静态方法(无需使用对象的内容),类方法,普通方法(使用对象中的数据) 3.特性:普通特性(将方法伪造成字段) 通过类去访问的有:静态字段,静态方法,类方法 通过对象去访问的有:普通字段,类的方法 自己的成员自己去访问 静态方法:没有self,前添加@staticmethod,即为静态方法(通过类去访问) 类方法:比静态方法多一个参数,该参数是为了显示哪个类,前添加@classmethod 特性:

Python自动化开发 - 面向对象(二)

本节内容 1.isinstance(obj,cls)和issubclass(sub,super) 2.反射 3.__setattr__,__delattr__,__getattr__ 一. isinstance(obj,cls)和issubclass(sub,super) 1.isinstance(obj,cls) 检查obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() print(isinstance(obj, Foo)) # True 2.

Python 面向对象进阶(二)

1. 垃圾回收 小整数对象池 Python对小整数的定义是 [-5, 257),这些整数对象是提前建立好的; 在一个Python程序中,所有位于这个范围内的整数,使用的都是同一个对象; 单个字符共用对象,常驻内存; 大整数对象池 每一个大整数,均创建一个新的对象; intern机制 单个单词,不可修改,默认开启intern机制,共用对象,当引用计数为0时,则销毁; 字符串(含有空格),不可修改,没有开启intern机制,不共用对象; # 示例: a1 = "Helloworld" a2

Python之路【第十二篇】:Python面向对象高级

一.反射 1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩. 2 python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数 下列方法适用于类和对象(一切皆对象,类本身也是一个对象) 导入其他模块,利用反

python面向对象进阶

isinstance(obj,cls)检查是否obj是否是类 cls 的对象. isinstance(obj,cls)检查是否obj是否是类 cls 的对象. 反射 python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数(参数是对象,字符串格式的属性名) hasattr getattr setattr delattr __del__,就是析构方法,当对象在内存中被释放时,自动触发执行. 注:此方法一般无须定义,

python 面向对象(进阶篇)

上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数 面向对象三大特性:封装.继承和多态 本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象