Uma introdução intensiva aos atributos de classes em Python


prefácio

Os atributos   introduzidos neste artigo são os mesmos mencionados no blog anterioratributos de classe e atributos de instânciadiferente . As propriedades introduzidas anteriormenteretornará o valor armazenado, enquanto os atributos a serem introduzidos neste artigo sãoé uma propriedade especial cujo valor é calculado quando acessado. Além disso, esta propriedade também podeAdicionar mecanismo de proteção de segurança para atributos


1. Crie propriedades para cálculo

  Em Python, você pode passar @property (decorador)Converter um método em uma propriedade,deste modoImplementar propriedades para computação. Depois de converter o método em uma propriedade, você podeAcessar métodos diretamente pelo nome do método,eNão há necessidade de adicionar um par de parênteses "()", o que torna o código mais conciso.

insira a descrição da imagem aqui

A sintaxe para criar propriedades para cálculos   via @property é a seguinte:

@property
def methodname(self):
    block

Descrição do parâmetro :

  • methodname : Usado para especificar o nome do método, geralmente começando com uma letra minúscula.Este nome acabará sendo o nome da propriedade criada
  • self : um parâmetro obrigatório, representando uma instância da classe.
  • block : corpo do método, a função específica implementada. No corpo do método, geralmente termina com uma declaração de retorno, que é usada para retornar o resultado do cálculo.

  Por exemplo, defina uma classe retângulo, defina duas propriedades de instância no método _ _ init _ _ (), defina um método para calcular a área de um retângulo e aplique @property para convertê-lo em uma propriedade e, finalmente, crie uma instância da classe, e Para acessar as propriedades convertidas, o código é o seguinte:

class Rect:
    def __init__(self, width, height):
        self.width = width  # 矩形的宽
        self.height = height  # 矩形的高
    @property  # 将方法转换为属性
    def area(self):  # 计算矩形面积的方法
        return self.width * self.height  # 返回矩形的面积
rect = Rect(10, 20)  # 创建类的实例
print('矩形的面积为:', rect.area)  # 输出属性的值

  Depois de executar o código acima, o resultado é o seguinte:

矩形的面积为: 200

注意:通过 @property 转换后的属性不能重新赋值,如果对其重新赋值,将会报错如下图所示。

insira a descrição da imagem aqui


2. Adicionar mecanismo de proteção de segurança para atributos

  Em Python, por padrão, atributos de classe ou instâncias criadaspode ser modificado fora da classe, se você quiser restringir a modificação fora da classe, pode defini-la como privada, mas depois de defini-la como privada, não poderá obter seu valor diretamente por meio do nome da instância + nome do atributo fora da classe. Se você deseja criar umpode ler, mas não modificarpropriedades, entãoPropriedades somente leitura podem ser implementadas usando @property.
  Por exemplo, crie uma classe de programa de TV TvShow e, em seguida, crie um atributo show para exibir o programa de TV que está sendo reproduzido no momento. O código e os resultados da execução são mostrados na figura a seguir:

insira a descrição da imagem aqui

  O atributo show criado pelo método acima é somente leitura, tente modificar o valor desse atributo e, em seguida, obtenha-o novamente. Um erro será relatado conforme mostrado na figura a seguir:

insira a descrição da imagem aqui

  Não apenas uma propriedade pode ser definida como somente leitura por meio da propriedade, mas oInterceptores podem ser definidos para atributos,Agora mesmoAs propriedades podem ser modificadas, mas certas restrições precisam ser seguidas ao modificar. Por exemplo, algumas alterações são feitas no código acima para permitir que os usuários modifiquem programas sob demanda, mas apenas uma das séries de TV especificadas pode ser selecionada. O código fica assim:

class TvShow:  # 定义电视节目类
    list_show = ['县委书记', '红旗渠', '安居', '幸福里的春天', '狂飙']
    def __init__(self, show):
        self.__show = show
    @property  # 将方法转换为属性
    def show(self):  # 定义show()方法
        return self.__show  # 返回私有属性的值
    @show.setter  # 设置setter方法,让属性可修改
    def show(self, value):
        if value in TvShow.list_show:
            self.__show = '您选择了《{}》,稍后将播放'.format(value)
        else:
            self.__show = '您点播的电视剧不存在'
tvshow = TvShow('狂飙')  # 创建类的实例
print('正在播放:', tvshow.show)  # 获取属性值
print('您可以从{}中选择要播放的电视剧'.format(tvshow.list_show))
tvshow.show = '红旗渠'  # 修改属性值
print(tvshow.show)  # 获取属性值

  Os resultados em execução são os seguintes:

insira a descrição da imagem aqui

  Se você alterar o 'Canal da bandeira vermelha' na penúltima linha do código para 'o nome do povo', o seguinte efeito será exibido após a execução:

insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/2201_75641637/article/details/129503486
Recomendado
Clasificación