Python的面向对象(三):内置属性、类属性和对象属性、私有属性和方法

一.内置属性

Python中有很多的内置属性,我们可以通过使用内置函数dir来查看一个对象支持的所有属性和方法。

class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score
s1 = Student('zhangsan', 90)
print(dir(s1))

运行结果:

[‘class’, ‘delattr’, ‘dict’, ‘dir’, ‘doc’, ‘eq’, ‘format’, ‘ge’, ‘getattribute’, ‘gt’, ‘hash’, ‘init’, ‘init_subclass’, ‘le’, ‘lt’, ‘module’, ‘ne’, ‘new’, ‘reduce’, ‘reduce_ex’, ‘repr’, ‘setattr’, ‘sizeof’, ‘str’, ‘subclasshook’, ‘weakref’, ‘name’, ‘score’]

1._slots_

之前我们说过,Python中支持动态属性,可以直接给对象添加属性,但是,在某些情况下,我们想对属性进行管理,此时,就可以使用__slots__方法来实现。

class Student(object):
    __slots__ = ('name', 'score')  #控制了属性,只能对name和score属性进行修改,不能再添加属性
    def __init__(self, name, score):
        self.name = name
        self.score = score

s1 = Student('zhangsan', 90)
s1.name='lisi'   #修改name属性
print(s1.name)   # lisi
s1.gender='male' #添加一个gender属性
print(s1.gender) #报错

2._doc_

可以用来展示类的描述信息。

class Student(object):
    '''
    Student():学生类
    name:学生姓名
    score:学生成绩
    '''
    def __init__(self, name, score):
        self.name = name
        self.score = score
        
print(Student.__doc__)

运行结果:

Student():学生类
name:学生姓名
score:学生成绩

3._module_ 和_class_

调用__module__ 可以查看当前操作的对象在哪个模块中;调用__class__ 可以查看当前操作的对象的类是什么。

class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score
        
s1 = Student('zhangsan', 90)        
print(s1.__module__)
print(s1.__class__)

运行结果:

main
<class ‘main.Student’>

4._dict_

把对象的属性和值以字典的形式显示出来。

class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score
        
s1 = Student('zhangsan', 90)        
print(s1.__dict__)

运行结果:

{‘name’: ‘zhangsan’, ‘score’: 90}

5._getitem_、_setitem_ 和_delitem_

如果想把对象当做字典一样来操作,可以使用这三种方法。

class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score

    def __getitem__(self, key):
        return self.__dict__[key]

    def __setitem__(self, key, value):
        self.__dict__[key] = value

    def __delitem__(self, key):
        del self.__dict__[key]


s1 = Student('zhangsan', 90) 
print(s1['name'])    # 会调用 __getitem__ 方法,直接打印属性对应的值
s1['name'] = 'lisi'  # 会调用对象的 __setitem__方法,修改属性对应的值
s1['score'] = 99
print(s1.name, s1.score)
del s1['score']      # 会调用 __delitem__ 方法,删除属性及对应的值
print(s1.__dict__)

运行结果:

zhangsan
lisi 99
{‘name’: ‘lisi’}

二.类属性和对象属性

类属性是类对象所拥有的属性,定义在类中;类属性可以通过类对象或者实例对象访问;类属性可以被该类的所有实例对象所共有。
通过类创建出来的对象被称为实例对象,对象属性也可以称为实例属性。实例属性要求每个对象为其单独开辟一个内存空间来记录数据,所以不同的对象的同名属性没有关联 ,互不影响。

class Student(object):
    type = '学生'   #在类中定义类属性

    def __init__(self, name, score):
        self.name = name
        self.score = score
        
s1 = Student('zhangsan', 90)   # 通过Student类创建出来的实例对象
#类属性可以通过类对象和实例对象来获取
print(Student.type)  # 学生   通过类对象获取类属性
print(s1.type)   # 学生     通过实例对象获取类属性
Student.type='human'   # 类属性只能通过类对象来修改,实例对象无法修改类属性
print(s1.type)   # human    

注意

  1. 尽量避免类属性和实例对象的属性同名,若同名,实例对象会优先访问实例对象的属性。
  2. 类属性只能通过类对象修改,不能通过实例对象修改。
  3. 类属性可以设置私有属性。

三.私有属性和方法

1.私有属性和私有方法

在实际开发中,对象的某些属性或者方法可能只希望在对象的内部使用,而不希望在外部被访问到,这时就可以定义私有属性私有方法

class Student(object):
    def __init__(self,name):
        self.name = name
        self.__score = 80  # 使用 __ 修饰的属性,是私有属性

    def __pass(self, line):
        if self.__score >= line:  # __score只能在对象内部使用
            print('该学生成绩合格')
        else:
            print('该学生成绩不合格')

    def test(self):
        self.__pass(60)  # __pass方法也只能在对象内部使用

s = Student('张三')
#print(s.__score)   会报错,不能直接访问对象内部的私有属性
s.test()    # 该学生成绩合格
# s.__pass()  会报错,不能直接调用pass函数,它是私有方法。

2.访问私有属性和私有方法

私有属性和私有方法都不能直接调用。但是,我们也可以通过一些操作在外部访问一个对象的私有属性和方法。
1.直接访问
语法格式:在私有属性名或者方法名前面添加’_类名’

class Student(object):
    def __init__(self,name):
        self.name = name
        self.__score = 80  

    def __pass(self, line):
        if self.__score >= line:  
            print('该学生成绩合格')
        else:
            print('该学生成绩不合格')

s = Student('张三')
print(s._Student__score)   # 80  
s._Student__pass(90)  # 该学生成绩不合格

使用对象名._类名__私有属性名 可以直接访问对象的私有属性(在实际开发中,不建议使用此方法来访问私有属性)
使用对象名._类名__函数名 可以直接调用对象的私有方法

2.定义方法访问私有变量
使用定义get和set方法这种方式来实现。

class Student(object):
    def __init__(self,name):
        self.name = name
        self.__score = 80  
        
    def get_score(self):  # 定义了get_score 方法,在这个方法里可以获取 __score的值
        return self.__score
        
    def set_score(self,new_score):# 定义了set_score 方法,在这个方法里可以修改 __score的值
        self.__score=new_score
        
s = Student('张三')
print(s.get_score())   # 80
s.set_score(90)
print(s.get_score())   # 90
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值