08.07面向对象

访问可见性

  • 私有变量,变量名前面加"__"
  • 私有不可继承,不可在外部调用,但可以在内部调用。
  • 如果非要使用私有变量,那么可以使用dir(class())去查看它真正的名字。
  • 私有变量/函数,在类内部可以直接调用。
  • 如果你想体现一个变量/函数特别重要你可以使用"_"
#私有
class
A(object): def __init__(self): self.__a=1000 self.__b=100 def __B(self): print(self.__a) self.c() def __c(self): print(self.__a) A_=A() print(A_._A__a)
  • 例:私密空间

class squre(object):
    def __init__(self):
        self._mi="藏起来,不给看,想看输密码"  
    @property
    def mi(self):
        return self._mi
    @mi.setter
    def mi(self,str_):
        self._mi=str_
def look():
    s=squre()
    print(s.mi)
def change(password,str_):
    if password =='2323213':
        s=squre()
        s.mi=str_
        print(s.mi)
    else:
        print('密码错误')

change('2323213','hhhhh')

@property装饰器and@.setter装饰器

使用装饰器的时候,需要注意:

  1. 装饰器名,函数名需要一致.
  2. property需要先声明,再写setter,顺序不能倒过来
  3.  如果你希望一点变量只是被访问不能被修改,那么可以使用访问器@property
  4. 如果要修改访问器中的变量,可以搭建一个修改器,或者删除访问器.
#装饰器的使用
class
Name(object): def __init__(self,a,b): self.__a=a self.__b=b @property def A (self): print(self.__a) name=Name(00,200) name.A
#修改器的使用
class Name(object):
    def __init__(self,a,b):
        self.__a=a
        self._b=b
    @property
    def A(self):
        print(self.__a)
    @A.setter
   def A(self,a1):
    self.__a=a1
   def play(self):
    print(self.__a)
    print(self.__b)
name=Name(100,200)
name.A=1000
name.play()
  • 例子:输入三个数字(私有),求三个数字的和,尝试更改其中两个数字
class A(object):
    def __init__(self,a,b,c):
        self.__a=a
        self.__b=b
        self.__c=c
    @property
    def B(self):
        print(self.__a)
    @B.setter
    def B(self,num):
        self.__a=num
    def sum(self):
        print(self.__a+self.__b+self.__c)
a=A(12,1,4)
a.B=99
a.sum() 

在python中类是动态的。

class Num(object):
    def __init__(self):
        self.a = 1000
    
    def A(self):
        print(self.b)


num = Num()
num.b =1000000
# print(num.a)
print(num.b)
num.A()

__slots__魔法

       我们讲到这里,不知道大家是否已经意识到,Python是一门动态语言。通常,动态语言允许我们在程序运行时给对象绑定新的属性或方法,当然也可以对已经绑定的属性和方法进行解绑定。但是如果我们需要限定自定义类型的对象只能绑定某些属性,可以通过在类中定义__slots__变量来进行限定。需要注意的是__slots__的限定只对当前类的对象生效,对子类并不起任何作用。

class Person(object):
    #限定Person对象只能绑定_name,_age和——gender属性
    __slots__ = ('_name','_age','_gender')
    def __init__(self,name,age):
        self.__name=name
        self.__age=age
原文地址:https://www.cnblogs.com/lxq0727/p/11315756.html