类的property特性

目录

  • 什么是 property特性
  • property特性单独使用
  • property特性+类的封装
  • setter/deleter装饰器
  • property的古老用法(了解)
  • property特性练习

什么是 property特性

  • property装饰器用于将被装饰的方法伪装成一个数据属性,在使用时可以不用加括号而直接使用

例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解)

  • 成人的BMI数值:

    • 过轻:低于18.5
    • 正常:18.5-23.9
    • 过重:24-27
    • 肥胖:28-32
    • 非常肥胖,高于32
  • 体质指数(BMI)= 体重(kg)÷ 身高^2(m)
    • e.g:70kg÷(1.75×1.75)=22.86
class People:
    def __init__(self, name, weight, height):
        self.name = name
        self.weight = weight
        self.height = height

    def bmi(self):
        return self.weight / (self.height**2)

peo1 = People('nick', 70, 1.8)
print(peo1.bmi())
21.604938271604937

property特性单独使用

class People:
    def __init__(self, name, weight, height):
        self.name = name
        self.weight = weight
        self.height = height

    @property
    def bmi(self):
        return self.weight / (self.height**2)

peo1 = People('nick', 70, 1.8)
print(peo1.bmi)
21.604938271604937
peo1.height = 1.85
print(peo1.bmi)
20.45288531775018

property特性+类的封装

class People:
    def __init__(self, name):
        self.__name = name

    @property  # 查看obj.name
    def name(self):
        return '<名字是:%s>' % self.__name

peo1 = People('nick')
print(peo1.name)
<名字是:nick>
try:
    peo1.name = 'EGON'
except Exception as e:
    print(e)
can't set attribute

setter/deleter装饰器

  • 控制属性的修改和删除

class People:
    def __init__(self, name):
        self.__name = name

    @property  # 查看 obj.name
    def name(self):
        return '<名字是:%s>' % self.__name

    @name.setter  # 修改 obj.name=值 触发
    def name(self, name):
        if type(name) is not str:
            raise TypeError('名字必须是str类型傻叉')
        self.__name = name

    @name.deleter  # 删除 del obj.name 触发
    def name(self):
        # raise PermissionError('不让删')
        print('不让删除傻叉')
        # del self.__name

peo1 = People('nick')
print(peo1.name)
<名字是:nick>
try:
    peo1.name = 10
except Exception as e:
    print(e)
名字必须是str类型傻叉
peo1.name = 'Nick'
print(peo1.name)
<名字是:Nick>
del peo1.name
不让删除傻叉

property的古老用法(了解)

class People:
    def __init__(self, name):
        self.__name = name

    def tell_name(self):
        return '<名字是:%s>' % self.__name

    def set_name(self, name):
        if type(name) is not str:
            raise TypeError('名字必须是str类型傻叉')
        self.__name = name

    def del_name(self):
        print('不让删除傻叉')

    # 相当于添加了property、setter、deleter装饰器(推荐使用装饰器)
    # 与property()方法内的函数名字无关,三个函数必须依次为打印、修改、删除
    name = property(tell_name, set_name, del_name)

peo1 = People('egon')
print(peo1.name)
<名字是:egon>
peo1.name = 'EGON'
print(peo1.name)
<名字是:EGON>
del peo1.name
不让删除傻叉

property特性练习

  • 圆的周长和面积

import math

class Circle:
    def __init__(self, radius):  # 圆的半径radius
        self.radius = radius

    @property
    def area(self):
        return math.pi * self.radius**2  # 计算面积

    @property
    def perimeter(self):
        return 2 * math.pi * self.radius  # 计算周长

c = Circle(10)
print(c.radius)
10
print(c.area)  # 可以向访问数据属性一样去访问area,会触发一个函数的执行,动态计算出一个值
314.1592653589793
print(c.perimeter)  # 同上
62.83185307179586

原文地址:https://www.cnblogs.com/nickchen121/p/10990412.html

时间: 2024-08-04 08:33:53

类的property特性的相关文章

2015.12.22 类的三大特性 协议的简单介绍

类的三大特性:封装.继承.多态 封装: 1. 对于头文件里面的一些成员变量,可以使用@private @public @protected来限制权限 @public  公有的 类本身可以访问,子类可以继承,外部也可以访问 pxd->name @private 私有的 类本身可以访问,子类无法继承,外部不可以访问 @protected 受保护的 类本身可以访问, 子类可以继承, 外部不可以访问.默认就是protected 2.需要给外部使用的方法或者属性就定义在头文件里面声明.h 不需要暴露给外部

OC基础 类的三大特性

OC基础  类的三大特性 OC的类和JAVA一样,都有三大特性:继承,封装,多态,那么我们就来看一下OC中类的三大特性. 1.继承 继承的特点: (1)子类从父类继承了属性和方法. (2)子类独有的属性和方法不能被父类使用. (3)子类独有的属性和方法,不能够在子类之间互相使用. (4)子类能够重写父类的方法,子类调用该方法时:首先调用子类的方法,如果子类没有该方法,就调用父类的该方法. (5)子类对象指针可以转换成父类对象指针,但是父类对象指针不能够转换成子类对象指针. 三种权限变量的继承:

day19-面向对象之封装、property特性、绑定与非绑定

一.面向对象之封装 1.1.引言 从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,还有alex一起装进麻袋,然后把麻袋封上口子.照这种逻辑看,封装='隐藏',这种理解是相当片面的 2.1-如何隐藏(在python中用双下划线开头的方式将属性隐藏起来(设置成私有的)) #其实这仅仅这是一种变形操作且仅仅只在类定义阶段发生变形 #类中所有双下划线开头的名称如__x都会在类定义时自动变形成:_类名__x的形式: class A: __N=0 #类的数据属性就应该是共享的,但是语

面向对象类成员之特性

1. 类中的特性关键字 @property 访问特性 2. 关键字@end.setter 设置特性 3.普通方法需要加()来执行方法 4.特性,不需要加()来执行,相当于通过字段来访问,即将方法伪造成一种字段,但是缺点是不能传参数. class Provice: # 静态字段,类中 country = "China" def __init__(self, name): temp = "xxx" # 普通字段,对象中(self就是对象) self.name = nam

OC学习篇之---类的三大特性(封装,继承,多态)

之前的一片文章介绍了OC中类的初始化方法和点语法的使用:http://blog.csdn.net/jiangwei0910410003/article/details/41683873,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今天就来看一下OC中类的三大特性: 一.封装 学习过Java中类的同学可能都知道了,封装就是对类中的一些字段,方法进行保护,不被外界所访问到,有一种权限的控制功能,Java

Spring利用propertyConfigurer类 读取.property数据库配置文件

1.Spring的框架中,org.springframework.beans.factory.config.PropertyPlaceholderConfigurer类可以将.properties(key/value形式)文件中 一些动态设定的值(value),在XML中替换为占位该键($key$)的值, .properties文件可以根据客户需求,自定义一些相关的参数,这样的设计可提供程序的灵活性. 2.在Spring中,使用PropertyPlaceholderConfigurer可以在XM

第八章 类对象的特性

第八章 类对象的特性 面向对象程序设计有4个主要特点:抽象.封装.继承和多态. 任何对象都应当具有两个要素,即属性和行为.对象是由一组属性和一组行为构成的. 1.类的声明和对象的定义 *类是对象的抽象,对象是类的具体实现. *类的声明: class 类名{ 成员属性:成员:... } *对象的定义:与普通类型相同: 2.类的成员函数 *成员函数的性质:public,protected,private *类外定义成员函数:(要体现作用域)函数类型 类名::函数名(参数表){函数体:} *内置成员函

转 OC温故:类的三大特性(封装,继承,多态)

原文标题:OC学习篇之---类的三大特性(封装,继承,多态) 我们都知道,面向对象程序设计中的类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今天就来看一下OC中类的三大特性: 一.封装 封装就是对类中的一些字段,方法进行保护,不被外界所访问到,有一种权限的控制功能,Java中有四种访问权限修饰符: 1 public,default,protected,private 访问权限依次递减,这样我们在定义类的时候,哪些字段和方法不想暴露出去,哪些字段和方法可以暴露,可以通过

第9章 Java类的三大特性之一:继承

1.什么是继承 子类继承父类就是对父类的扩展,继承时会自动拥有父类所拥有的处private之外的所有成员作用:增加代码复用语法格式: class 子类名 extends 父类名{----}第9章 Java类的三大特性之一:继承例子: 1 //测试类,创建子类对象,可以直接调用属性和方法 2 public class testDog { 3 public static void main(String[] args) { 4 Dog dog = new Dog(); 5 dog.age=10; 6