第二十二课:面向对象(4)

本文详细介绍了Python面向对象编程中的类属性、实例属性和私有属性。类属性可以在类的初始化中定义,可通过类名或实例名访问。实例属性在`__init__`中初始化,通常通过`self.`访问。私有属性以双下划线`__`开头,外部无法直接访问,但可通过特殊方式间接访问。文章还讨论了访问限制,并提供了四则运算的面向对象实现练习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、类属性与实例属性

        1:实例属性:     

                在__init__(self,...)中初始化     

                内部调用时都需要加上self.     

                外部调用时用“对象名.属性名”调用

        eg:

# 实例属性
class eg():
    def __init__(self,name,food):
        self.name = name
        self.food = food

    #内部调用:self.属性名
    def neibu(self):
        print(self.name,self.food)

#实例化
a=eg('job','fish')

#外部调用:对象名.属性名
a.name='hello'
print(a.name)

2:类属性:

    在__init__()里初始化

    在内部用classname.类属性名调用

    外部既可以用classname.类属性名又可以用instancename.类属性名来调用

        eg:

#类属性
class eg1():

    country = 'China'   #类属性

    def __init__(self,name,food):
        self.name = name
        self.food = food

    # 内部调用:类名.类属性名
    def a(self):
        print(eg1.country)

#外部调用:类名.类属性名
print(eg1.country)

3:私有属性:

        双下划线__开头:外部不可通过“对象名.属性名”来访问或者更改,实际将其转化为了“_类名__属性名”。

        eg:

#私有属性
class eg2():
    def __init__(self,name,food,country):
        self.name = name
        self.food = food

        self.__country = country    #私有属性

    def a(self):
        print('我是私有属性:%s'%self.__country)

#实例化
b=eg2('MgVccl','fish','China')

#外部不可通过“对象名.属性名”来访问私有属性
print(b.country) # AttributeError: 'eg2' object has no attribute 'country'

二、访问限制

       1. 私有类属性、私有对象属性 

        为了保护属性不被随意修改和访问,可以将属性定义为私有属性。 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。

        2.私有属性不能直接通过对象访问属性,但是可以通过“实例化对象名._类名__属性名”直接进行访问。但是不建议这样操作.不同版本的Python解释器可能会把“__属性名”改成不同的变量名。 总的来说就是,Python本身没有任何机制阻止你干坏事,一切全靠自觉。

        3.通过“对象名.__属性名”直接修改私有属性。

         表面上看好像修改了其实并没有,因为Python解释器已经将对象内部的属性名解释成“_类名__属性名”。如果在外部修改相当于另外声明一个属性。 能直接修改吗?类属性可以直接修改通过类名._类名__属性名=(可通过类方法定义后面说明)。

        eg:

class eg3():
    def __init__(self,name,food,country):
        self.name = name
        self.food = food

        self.__country = country    #私有属性

    def a(self):
        print('我是私有属性:%s'%self.__country)

#实例化
c=eg3('MgVccl','fish','China')

#可以通过“实例化对象名._类名__属性名”直接进行访问
#不建议这样操作.不同版本的Python解释器可能会把“__属性名”改成不同的变量名。
# print(c._eg3__country)

#在外部修改相当于另外声明一个属性
c.__country='重庆'
print(c.__country)

练习:

        使用面向对象的方式实现加减乘除四则运算。

#使用面向对象的方式实现加减乘除四则运算。
class operation():
    '''
    加减乘除的四则运算:
    加法:add(x,y) x+y;
    减法:sub(x,y) x-y;
    乘法:mul(x,y) x*y;
    除法:div(x,y) x/y;
    '''

    #实例化属性
    def __init__(self,x,y,s):
        self.x = x
        self.y = y
        self.s = s

    #     加法:add(x,y) x+y
    def add(self):
        self.s = self.x + self.y
        return print('%d + %d = %d'%(self.x,self.y,self.s))

    # 减法:sub(x,y) x-y
    def sub(self):
        self.s = self.x - self.y
        return print('%d - %d = %d'%(self.x,self.y,self.s))

    # 乘法:mul(x,y) x*y
    def mul(self):
        self.s = self.x * self.y
        return print('%d * %d = %d'%(self.x,self.y,self.s))

    # 除法:div(x,y) x/y
    def div(self):
        if self.y == 0:
            print('除数不能为0!')
        else:
            self.s = self.x / self.y
            return print('%d / %d = %d'%(self.x,self.y,self.s))

if __name__ == '__main__':
    x=int(input('请输入x:'))
    y=int(input('请输入y:'))
    s=0
    a=operation(x,y,s)
    a.add()
    a.sub()
    a.mul()
    a.div()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值