11面向对象编程-类、实例、访问限制、数据封装

类(Class)和实例(Instance)

  • 类是抽象的模板
  • 实例是根据类创建出来一个个具体的“对象”,每个对象都具有相同的方法,但各自的数据可能不同

定义类(class)

  • class 类名(类名通常首字母大写)(object):
  • object类是所有类最终都会继承的类

创建实例

  • 实例1 = 类名 + ()
  • 如: Zhangsan = Student()

由于类是实例的模板,故可以在类中创建一些属性,只要是该类实例都具有该属性

方法可以通过__init__方法

  • _init_(self,…):

1、第一个参数永远都是self,表示创建的实例本身,
可以把各种属性绑定到self,因为self就指向创建的实例本身
2、self,后面的参数都可以自定义,需要什么参数创建什么参数

注意:有了__init__方法,在创建实例的时候,就不能传入空的参数了,
必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去

# 定义学生类
class Student(object):
    def __init__(self,name,score):
        self.name = name
        self.score = score


# 创建实例
stu1 = Student('张三',99)
print(stu1.name)
print(stu1.score)

数据封装

  • 面向对象编程其中重要特点就是封装
  • 在创建好实例后,还需要在定义一个函数,将数据一一打印出来,
  • 既然实例中本身就具有数据,故没必要从外面的函数访问,
    可直接在Student类中定义访问数据的函数,这样就把“数据封装起来了”
  • 封装数据的函数是与类本身是关联的,称为类的方法
# 定义学生类
class Student(object):
    def __init__(self,name,score):
        self.name = name
        self.score = score

#定义访问数据的函数
    def visit(self):
        print("%s:%i" %(self.name,self.score))

stu2 = Student("法外狂徒张三",60)
stu2.visit()

访问限制

在Class内部,可以有属性和方法,从外部代码可通过直接调用实例变量的方法操作数据,从而隐藏了内部的复杂逻辑

从student类中看,外部代码也可自由修改实例的变量值

如果要让内部属性不被外部访问,可以把属性的名称前加两个下划线__
在python中,实例的变量如果以__开头,就变成了一个私有变量(private)
只有内部可以访问,外部不能访问

确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮

__xxx__、_xxx、__xxx区别
1、__xxx__:以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的
2、_xxx:一个下划线开头的实例变量名外部是可以访问的,但是,
按照约定俗成的规定,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”
3、__xxx:私有变量 ( 是不是一定不能从外部访问呢?其实也不是 )

# 定义学生类
class Student1(object):

# 创建学生属性函数
    def __init__(self,name,score):
        self.__name = name
        self.__score = score
        # self.name = name
        # self.score = score

#创建访问数据函数
    def visit(self):
      print("%s:%s" %(self.__name,self.__score))
#         print("%s:%s" % (self.name, self.score))
#创建stu1实例
stu1 = Student1('张三',89)

#调用class中的方法
stu1.visit()
stu1.score = 99
stu1.visit()

获取对象信息

如果要获得一个对象的所有属性和方法,可以使用dir()函数,返回一个包含字符串的list
配合getattr()、setattr()以及hasattr()

getattr() 函数用于返回一个对象属性值
语法:getattr(object, name[, default])

setattr() 函数对应函数 getattr(),用于设置属性值,该属性不一定是存在的
setattr(object, name, value)

hasattr() 函数用于判断对象是否包含对应的属性
hasattr(object, name)

通过内置的一系列函数,我们可以对任意一个Python对象进行剖析,拿到其内部的数据
要注意的是,只有在不知道对象信息的时候,我们才会去获取对象信息

实例属性和类属性

Python是动态语言,根据类创建的实例可以任意绑定属性
类属性:在类中定义的属性
实例属性:创建实例后,实例自己的属性

注意:实例属性和类属性使用相同的名字,实例属性将屏蔽掉类属性(优先级:实例属性 > 类属性),
但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性

>>> s = Student()
>>> s
<__main__.Student object at 0x000002C5687A75E0>
>>> print
<built-in function print>
>>> print(s.name)
Student
>>> s.name = 'ssss'
>>> print(s.name)
ssss
>>> del s.name
>>> print(s.name)
Student
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值