四时宝库

程序员的知识宝库

Python关于class(类)的知识(python中class类的用法)

目录:

面向对象编程,类的定义,类的属性,类方法,__init__ 初始化魔法方法


面向对象编程

面向对象(object-oriented ;简称: OO) 至今还没有统一的概念 我这里把它定义为: 按人们 认识客观世界的系统思维方式,采用基于对象(实体) 的概念建立模型,模拟客观世界分析、设计、实现软件的办法。

# **程序是由数据和功能组合而成的对象构建起来的**

面向对象编程(Object Oriented Programming-OOP) 是一种解决软件复用的设计和编程方法。 这种方法把软件系统中相近相似的操作逻辑和操作应用数据、状态,以类的型式描述出来,

# 以对象实例的形式在软件系统中复用,以达到提高软件开发效率的作用。


  • 面向过程 VS. 面向对象
Bash
面向过程:根据业务逻辑从上到下写代码,
面向对象:对数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程

- 面向对象和面向过程都是解决问题的一种思路而已

  - 当遇到一个需求的时候不用自己去实现,如果自己一步步实现那就是面向过程
  - 应该找一个专门做这个事的人来做
  - 面向对象是基于面向过程的




如何将面对对象带入到编程中去?----通过class 类


类的定义

  • 类基本概念及理解

类是对象的抽象化,类是一群具有相同特征或行为的事物的统称。(如人类)


  • 类的定义的格式
Bash
class 类名():
    pass


  • 类的命名规则:
Bash
驼峰命名法(首字母大写)
只能是一个词,不能有空格。
只能包含字母、数字、和下划线。
不能以数字开头。
不可以使用关键字(重名) 例如int,class
取名尽量有意义---见名思意


  • 调用:类的实例化
Bash
class Person():
    pass

# 调用:类的实例化
wum = Person()  # wum是Person类的一个实例对象
mar = Person()  # 同上


  • 类的构成:属性及方法
Bash
类可以看作是独立存放【属性及方法】的空间。
类就像人拥有其独特的特性(属性)以及行动(方法)


  • 类与实例之间的联系
Bash
类是一个事物的抽象,不是真实存在的,描绘了事物的共性
实例:某类事物的具体个体,是该类事物的具体表现,真实存在

实例是存放变量的空间,不同实例之间互不可见,即互不影响
***实例对象可以获得类中所有的属性及方法***
  在查找属性时,会优先在实例中查找,然后在类中查找


类的属性----共有属性 和 私有属性

  • 可以通过dir()查看类的内置属性、内置方法、内置函数


  • 共有属性----可直接访问、修改

共有属性前没有下划线,实例可以直接访问,也可以修改


  • 私有属性分两类:
Bash
属性前加'_'一个下划线,外部可以直接访问
属性前加'__'两个下划线,外部不可以直接访问,因为访问名称改变了,可以通过dir()查看
私有属性可以更好的保存属性安全,即不能随意修改

# 私有属性是一种规范,并非限制,因此可以通过特定的方法访问私有属性
# 定义在类中的私有属性也可以被子类(实例对象)继承



_ 和 __这是一种规范(约定), 没有真正的限制作用,因此仍可以访问前面有两条下划线的私有属性。

访问两条下划线的私有属性的方法:_类名+__私有属性名(例如:_Person__age)



  • 实例对象类属性的添加
Bash
class Person():
    name = '小明'

xiaoming = Person()
xiaoming.age = 18     #给xiaoming这个实例对象添加age属性,而Person类是没有age这个属性的
print(xiaoming.age)

18


类方法

类方法就是针对 类对象定义的方法;如果类是人类,那么类方法可以理解为是人类的行动


  • 定义类方法的格式:通常将默认传入方法名后的参数命名为self

self代表实例对象本身

方法总是定义在类中,但是却叫实例方法,因为它表示该类所有实例共有的行为

class Person():

def 方法名(self): #定义类方法一定要在类中,因此要注意左边缩进

pass


  • 调用类方法

通过实例对象调用





__init__ 初始化魔法方法

定义和用途

#定义:

所谓魔法方法,就是在特定条件下,自动触发方法。

__init__魔法方法则是在实例化后自动调用,以完成实例初始化。


#用途:

该函数可用于解决:每一个实例化对象需要不同的属性

**初始化的定义必须在类的开头**


在初始化定义时:

1.多个属性的值可以在实例对象调用时传入

2.可以固定属性的值

3.可以修改固定属性的值

Bash
#定义类
class Person():
    def __init__(self,num,name):
        self.age = num    

        self.gender = '男'      
#固定属性的值,即所有实例对象都有gender属性值('男'),若要修改可以在实例对象调用时直接改

        self.name = name     
        

#调用实例
xiaoming = Person(8,'小明')
print(xiaoming.age)    
print(xiaoming.name)       
print(xiaoming.gender)

h = Person(50,'h')
print(h.gender)

xiaohua = Person(18,'小花')
xiaohua.gender = '女'           #将xiaohua这个实例对象的gender从 '男' 改成 '女'
print(xiaohua.gender)

8

小明

男 -------h.gender

女--------xiaohua.gender


私有属性调用方式:

1.调用私有属性方式:_类名__属性名

2.在方法中调用私有属性,在外部调用时可以直接调取

3.可以定义一个方法,专门返回私有属性,这样在外部调用该方法时,可以直接调用私有属性

4.可以定义一个方法,专门返回改变后的属性,再用返回私有属性方法,打印改变后的属性

5.最后返回的结果和定义时的函数顺序无关,和调用实例对象时的代码顺序有关


Bash
class Person():
    def __init__(self,name):
        self.__name = name      #__name是私有属性

    def eat(self):
        print(f'{self.__name}吃饭')      
#在方法中调用私有属性,在外部可以直接调用该方法获得私有属性

    def to(self):                #查找返回私有属性
        return self.__name

    def set_name(self,newname):      #修改私有属性
        self.__name = newname

xiaoming = Person('小明')
xiaoming.eat()              #调用eat方法,可以直接调用私有属性name
print(xiaoming.to())        #查找修改前的私有属性name
xiaoming.set_name('hhh')    #调用set_name方法,修改私有属性name的值为'hhh'
print(xiaoming.to())        #查找修改后的私有属性name

#最后返回的结果和定义时的函数顺序无关,和调用实例对象的代码顺序有关,
因此虽然在定义方法时,to查找方法在set_name修改方法之前,但是他们的定义顺序和最后输出的
结果无关,只要在调用方法时注意他们的先后顺序就能输出想要的结果(修改前或修改后的私有属性)

小明吃饭

小明 ----修改前的私有属性

hhh ----修改后的私有属性

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接