一文看懂Python(六)-----类与对象篇

今天给大家介绍“对象”。众所周知,Python是一门面向对象的编程语言,Python之所以如此强大,很大一部分原因也是因为Python中无处不对象,由此可知,学好Python的关键之一就是学好类与对象。好!步入正题。

一、什么是类、什么是对象

  • 类的定义
    一个类包括:
    • 1.属性,描述的是类的静态属性
    • 2.方法,描述的是类的动作- 对象的定义
  • 对象的定义
    通过类定义的数据结构实例,因此也被称为实例对象。
  • 小案例
# 定义一个学生类
class Stu:
    numid = 2020000078
    name = 'djk'
    gender = 1
    def Print(self):
        print('我是一个学生!')
# 实例化一个对象stu
stu = Stu()
stu.Print()

二、类如何定义

class Stu:
    def __init__(self,numid,name,gender,loc):
        self.numid = numid
        self.name = name
        self.gender = gender
        self.loc = loc
    def Print(self):
        print(self.numid,self.name,self.gender,self.loc)
# 实例化
stu = Stu(1,'djk',1,'shandong')
# 调用Print()函数
stu.Print()

至于这里为什么有个self,可以看我另一篇文章,里面讲解的非常清楚,这里就不详细介绍了,而且还通过与Java语言做对比来理解self。深入理解Python中的self参数和__init__(self)方法–通过类比Java语言

三、面向对象的三大特征

3.1 封装

对象就是一个封装,将属于对象的属性和方法封装成一个类,只允许对象自己在内部访问!

3.2 继承

  • 继承是子类自动共享父类之间数据和方法的机制
  • 案例
class Parent:
    def Hello(self):
        print('正在调用父类的方法')
class Child(Parent):
    pass
p = Parent()
p.Hello()
c = Child()
c.Hello()

在这里插入图片描述

  • 如果子类中定义与父类同名的方法和属性,则会自动覆盖父类对应的属性和方法
  • 案例
class Parent:
    def Hello(self):
        print('正在调用父类的方法')
class Child(Parent):
    def Hello(self):
        print('正在调用子类的方法')
p = Parent()
p.Hello()
c = Child()
c.Hello()

在这里插入图片描述

3.3 多态

  • 什么是多态呢?
    多态就是方法名一样,但是方法的实现方式不一样
  • 案例
# 多态案例
class A():
    def fun(self):
        print('我是小A')
class B():
    def fun(self):
        print('我是小B')
a = A()
a.fun()
b = B()
b.fun()

在这里插入图片描述

四、什么是公有、什么是私有

  • 类Class中成员变量有两种属性分别是:实例属性和类属性。

  • 实例属性是在构造函数中定义的(__init__),定义时候以self作为前缀。

  • 类属性是在类中方法之外但又在类之中定义的属性。类属性在所有实例之间共享。在类内部和类外部都可以通过"类.类属性"来访问。

两者访问形式:主程序中,实例属性只能通过对象名访问;而类属性能够通过类名访问,也可以通过对象名访问。

  • 对于公有成员(方法和变量),可以公开使用,既可以在类内部访问,也可以在类外部访问。

  • 对于私有成员(方法和变量),只能在类内部使用,但也可以通过特殊的方法进行访问,即"对象名._类名+私有成员",book._Book__types。

    • 两者表现形式:类属性定义时,如果以两个短下滑线"__"开头则表示是私有属性,否则就是公有属性。例如,self.size = s为私有属性,而self.price = money为公有属性。
      私有方法:以两个下滑线"
      "开始,不能通过对象名直接调用。只能在属于对象的方法中通过self调用。例如,self._namemethod
  • 公有方法:通过对象名直接调用。例如,a.printLcs

  • 静态方法:可以通过类名和对象名调用,但不能直接访问属于对象的成员,只能访问属于类的成员。

五、一些相关的BIF

方法名 方法介绍
issubclass(class,classinfo) 如果class是classinfo的一个子类,返回True
isinstance(object,classinfo) 检查一个实例对象object是否是属于classinfo类的
hasattr(object,name) 测试一个对象object是否有指定的属性name
getattr(object,name[,default]) 返回对象指定的属性值,如果属性不存在的话,,如果设置了default,则将default打印出来;否则会抛出一个AttributeError的异常
setattr(object,name,value) 设置对象中指定属性的值,如果指定属性不存在,会新建一个属性并赋值
delattr(object,name) 删除对象中指定属性;如果指定属性已经不存在,则会抛出一个AttributeError的异常
property(fget = None,fset = None,fdel = None,fdoc = None) 以自己定义好的属性去设置属性

六、类、类对象与实例对象的关系

class C:
    count = 0
a = C()
b = C()
c = C()
print('a修改之前:{}'.format(a.count))
print('b修改之前:{}'.format(b.count))
print('c修改之前:{}'.format(c.count))
c.count += 10 # 修改的是实例对象c
print('c修改实例对象之后:{}'.format(c.count))
# 我们修改类对象
C.count += 100
print('a修改之后:{}'.format(a.count))
print('a修改之后:{}'.format(b.count))
print('c修改类对象之后:{}'.format(c.count))
# 为什么会这样呢?因为实例属性将类属性给覆盖了,我们只能看到实例属性,不能看到类属性

猜你喜欢

转载自blog.csdn.net/dongjinkun/article/details/113739258