精华内容
下载资源
问答
  • 小型商城系统的分类/产品属性/扩展属性的数据库设计  正文:  之前发表过一篇"商城系统【商品扩展属性】的表单生成及客户端验证",部分童鞋对于后台数据库的设计比较感兴趣,于是今天把这部分也补上...

    中小型商城系统中的分类/产品属性/扩展属性的数据库设计

          正文:

          之前发表过一篇"商城系统中【商品扩展属性】的表单生成及客户端验证",部分童鞋对于后台数据库的设计比较感兴趣,于是今天把这部分也补上。

          一、产品分类设计
          越来越多的商城系统都热衷于选择“无限级分类”的设计,我也不例外,因为它方便扩展。这部分就不详细展开了,详见

          无限级分类(非递归算法/存储过程版/GUID主键)完整数据库示例_(1)表结构 
          无限级分类(非递归算法/存储过程版/GUID主键)完整数据库示例_(2)插入记录

          无限级分类(非递归算法/存储过程版/GUID主键)完整数据库示例_(3)删除记录

          无限级分类(非递归算法/存储过程版/GUID主键)完整数据库示例_(4)显示记录

          稍微啰唆几句:
          1.1 我习惯于把所有表加上前缀T_(即Table的第一个字母),把所有字段加上前缀F_(即Field的第一个字母),把视图加上前缀V_(即View的第一个字母)...,这样最大的好处是在写linq to Sql时,智能提示(感应)会很爽,所有相关的东西全部列在一起,省去记忆脑细胞无数

          1.2 这是我06年时从动网论坛剥下来的表结构(当然我又做了一些改造),它的最大特点在于:通过添加一些辅助字段完全避开了无限分类中的递归问题。
          1.3 之所以用guid做为主键,主要是考虑到数据库迁移时的方便,当然guid主键会带来一些性能上的损失(二害相权,取其轻也),为了改进可将guid改为comb主键(详见 “Integer GUID和Comb做主键的效率测试”)
          1.4 考虑到很多人为了各种原因喜欢把分类页生成静态页,而为了url地址的简短/友好,guid主键有些长,所以我又添加了一个辅助字段F_AutoId,这样生成的静态页可以从类似"43A6162C-308A-4112-86F8-6E6B6B76FC6E.html"变成"1234.html"

          二、产品分类--产品关联设计

          如果“产品:分类”是1:1关系(即:一个产品只能归到一个分类下),则直接在产品表(T_Product)中增加一个字段(F_ClsId)即可。
          如果“产品:分类”是1:N关系(即:一个产品能同时归到多个分类下),则必须新建一个表(T_ProductInClass),建二个字段(F_ClsId,F_ProductId),并把这二个字段设置为联合主键即可。

          注:1:1还是1:N取决于需求,没有谁好谁坏之说。

          三、扩展属性
          终于到了正题了,对于产品的扩展属性,因为(在产品分类未选择之前)无法事先确定产品的扩展属性有哪些,所以这部分属性显然不适合通过在T_Product中预留一大堆字段来解决(而且这样性能也不好)

          考虑到扩展属性总是基于分类的(比如:电脑类的产品应该具有"CPU频率、内存容量、显示器尺寸、硬盘大小"等扩展属性,而服装类产品应该具有“颜色、尺码、品牌、面料”等扩展属性),所以可以新建一个"分类扩展表"用于存储分类的扩展属性基础定义。

          1

          2

          3

          4

          5

          6

          7

          8

          9

          10

          11

          12

          13

          14

          15

          16

          17

          18

          CREATE TABLE [dbo].[T_ClassAppend](

          [F_Id] [uniqueidentifier] NOT NULL,--主键

          [F_ClsId] [uniqueidentifier] NOT NULL,--关联外键(分类ID)

          [F_DisplayName] [nvarchar](50) NOT NULL,--(扩展属性)显示名称(比如:品牌,内存大小,颜色之类)

          [F_FieldName] [nvarchar](50) NOT NULL,--(扩展属性)字段名称(比如:Brand,Memoery,Color之类)

          [F_ValueType] [nvarchar](50) NOT NULL,--字段类型(比如:字符串,整数,日期之类)

          [F_ValueLength] [int] NOT NULL,--属性值长度(比如:50)

          [F_InputType] [nvarchar](50) NOT NULL,--输入类型(比如:文本框,文本域,下拉框,复选框之类)

          [F_DefaultValue] [nvarchar](500) NOT NULL,--默认值

          [F_IsRequired] [tinyint] NOT NULL,--是否必须填写

          [F_isShow] [tinyint] NOT NULL,--显否显示

          [F_Orders] [int] NOT NULL,--排序号

          [F_AutoId] [int] IDENTITY(1,1) NOT NULL,--辅助自动ID(预留)

          CONSTRAINT [PK_T_ClassAppend] PRIMARY KEY CLUSTERED

          (

          [F_Id] ASC

          )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

          ) ON [PRIMARY]

          保存数据后的大概样子如下:

          解决了扩展属性的定义问题,接下来再来考虑产品的这些属性到底应该保存在哪里?

          先回顾一下产品上传的基本逻辑,在不考虑扩展属性的传统场景下:用户进入产品发布页面,选择产品分类,然后填写其它产品属性,最终保存到数据库。

          分析一下:只要用户选择了分类,我们就能得到分类ID,进而得到该类的“扩展属性定义”,也就知道了该产品应该具有哪些扩展属性,如果这时有一张特定的产品扩展属性表(来对应这些扩展属性的定义),那么直接把这些扩展属性insert进这张表即可。

          技术处理:保存产品时,先得到用户选择的分类ID,然后根据上面定义的T_ClassAppend分类扩展属性定义表,去检查是否已经生成了该类的"产品扩展属性表",如果没有则动态生成一个类似T_Product_XXXX的表(注:XXXX即为分类的F_AutoId值),然后该干嘛干嘛,常规公共属性保存进T_Product,扩展属性保存进T_Product_XXXX。

          注:T_Product 与 T_Product_XXXX 之间应该有(产品ID的)主外键关联

          如下图:

          注:图中的F_ID其实可去掉,没啥实际意义(最初我是打算用来保存记录流水号的,后来发现完全没啥必要,这一点精减工作就留给大家去做吧)

          可能存在的问题:
          1、产品修改时,如果从分类A改成了分类B(即发布时,产品分类选错了,在编辑时,重新指定产品分类),那么扩展属性对应的保存表名,可能会从T_Product_123 变成 T_Product_456,这时要注意先把原来的T_Product_123中的记录删除,不然时间长了,会留下一堆冗余记录。

          2、分类扩展属性有变动时,比如电脑类,又新增了一项属性:"是否支持双显卡(F_IsDoubleVGA)",那么这里原来的产品扩展属性表T_Product_123,也要相应的增加一个类似F_IsDoubleVGA的字段类型

          四、搜索问题的解决

          这部分其实是最难解决的,不过也不是没有办法,分二种情况:

          1、第一种情况

          通常情况下,用户其实很少一上来就搜索扩展属性,很多场合下,用户会先浏览某感兴趣分类列表,然后再挑选商品。

          这种情况就好办多了,因为用户一旦确定了分类,也就意味着能得到分类ID,进而得到最终的产品扩展属性表名(比如T_Product_123),这时搜索就简化为搜索 T_Product 与 某一个特定的T_Product_XXX

          2、第二种情况

          如果系统要求用户直接在搜索栏里输入 "ThinkPad 双显卡 4G内存 T系列"这类关键词,然后自动匹配出所有属性/扩展属性的商品。

          那么,其实这已经演化成网站搜索引擎的需求,传统的 select... like ...在这种需求下基本上已经没啥用处了,可以考虑用lucene或园子里"盘古分词"作者eaglet (注:该兄是搜索引擎方面的资深人士,值得信赖!)的解决方案来实现站内搜索引擎。

          后记:早上写得匆忙,有些细节没写详细,现在补上。

          看到回复中有些朋友觉得这种设计表太多,太复杂,这个嘛...其实我觉得还好啦,只是在原来的分类表T_Class的基础上,增加了一个T_ClassAppend表而已,至于那一堆的T_Product_XXX 表,我写了一个分类管理器来自动生成,不用手动来做,另外再封装一些逻辑(比如根据分类ID自动返回扩展属性表名之类),对于普通开发人员来讲,开发难度只是轻微增加而已.

          上图为分类管理器的界面。

          继续更新:

          看到越来越多的人回复来讨论这个问题,很是高兴(相互交流才能进步),特地又加了一张图,建议大家先在完全明白我的意图之后,再讨论如何改进,不然大家你用你的说法,我用我的说法,但其实完全有可能只是同一个问题的不同说法,这样沟通起来比较费劲。

          其实我的想法很简单:

          将商品的共用属性(比如:价格,商品名称,商品编码这些肯定要有的东西)与扩展属性(即:根据分类不同而不同的非共用属性,比如电脑类的"CPU/硬盘容量...",充值卡类的"面值/适用地区...",服装类的"尺码/颜色...")分开保存而已,相当于原本应该保存一张表T_Product中的东西,拆分成二部分。(但由于每个分类的特性不同,每个类对应的产品都有不同的扩展属性值,所以不适合把所有产品的扩展属性保存在同一张表中,如果这样可以的话,干嘛还要费心把共用属性与扩展属性分开,搞拆分这么麻烦?)

          共用属性保存到 T_Product表,而扩展属性保存到 T_Product_N 表(其中N 与 某一个分类记录的ID对应)

          在逻辑上可以认为,每条产品记录的全部属性,都是 "T_Product中的一条记录" + "T_Product_N(N为该产品所属分类的对应Id)中的一条记录" 共同描述的

          至于表的个数,其实只增加了“ 1 + N ” 张表(1即多出来的分类扩展属性定义表,而N即为T_Class中产品分类的记录条数),所以只要分类数不变,产品扩展表的数量也是一定的。

          至于大家提到的品牌问题,品牌其实最适合与分类当作平行处理,毕竟很多时候搞活动做专题,都是以品牌作为主要选择依据的(如果当成扩展属性处理,并非行不通,只是不适合)

          另外之所以会引出搜索问题,其实反过来考虑很容易理解,如果不做拆分,按传统方式,用Sql语句直接搜索T_Product表即可。但现在把属性分成了二部分,所以很难确定用户搜索时,是想搜索共用属性,还是扩展属性?所以有上面提到搜索的二种情况。

          最后谈一下数据库查询的问题,看到'小菁菁'同学的观点:数据库就是为了查询方便。基本上,这个没错!但是如果您遇到过单表千万级数量的情况,而且基于某些要求又无法利用索引。(比如最纠结的like该不该用的老问题:如果不用like,强制用=来处理,当然速度会快很多,但是查询就不准确,比如用户就记得产品描述中的几个字,别的都不记得,这时候站在用户的立场,无疑模糊查询是最好的,但是在海量数据情况下,这样做又几乎是灾难)。在这些特定情况下,关系型数据库(不管是sqlserver还是oracle)的查询能力都是无能为力的,如果您去百度一下关于搜索引擎的数据库设计,几乎看不到采用关系型数据库做为查询核心的。推荐几篇我以前收集的搜索引擎架构文章给您参考下http://www.cnblogs.com/yjmyzz/archive/2009/06/18/1506083.html

          当然"学无先后,达者为先"。如果大家有更好的解决方案,欢迎回贴指导。

          最后YY一句,就这种拍脑袋的设计,07年时曾经受住了日均IP10万的访问量,当时日均IP从中国站长站监测的结果,已经达到了同期中国新蛋日均IP的1.5倍(当然还有其它优化措施,这个就不一一展开了)

    展开全文
  • 在Qt Designer,提供了八大可视化组件(也称为组件或控件,下同),分别布局组件(Layouts)、分隔组件(Spacers)、按钮组件(Buttons)、表项视图(item views)、表项组件(item widg...

    本文适用人员:本文比较长,适合不理解Qt Designer部件属性的人员阅读或资料查找。

    声明
    1、如果有人认为本文是简单的复制粘贴+翻译而成,敬请读本文最后的后记;
    2、本文为老猿Python学习研究精心整理而成,禁止转载。

    内容提纲

    引言
    概述
           QWidget属性列表
           Qt Designer组件属性归类
    组件大小及位置控制的属性
    界面响应事件控制属性
    信息管理属性
    外观控制属性
    后记

    一、引言

    在Qt Designer中,提供了八大类可视化组件(也称为组件或控件,下同),分别为布局组件(Layouts)、分隔组件(Spacers)、按钮组件(Buttons)、表项视图(item views)、表项组件(item widgets)、容器(Containers)、输入组件(input widgets)、显示组件(Display widgets),在Qt Designer的应用界面设计时,可以将各种功能的组件拖拽到窗口上进行应用的可视化界面设计,而每种组件又可以指定不同的属性。

    组件的属性设置在Qt Designer中的组件属性编辑部分进行设置的,如下图右边部分窗口:
    在这里插入图片描述
    可以看到,将相关属性栏目节点收敛后,最顶层的节点为组件对应的类及所有父类,并且从上往下排列的节点,基本上按照父类在上,子类在下的方式排列,很好的体现了类的继承关系以及相关属性是哪个类提供的。上图中类的属性展开后截图如下:
    在这里插入图片描述
    在Qt Designer中对八大类组件逐一浏览后,从组件的设置属性界面我们可以看到,除了布局组件(Layouts)和分隔组件(Spacers),其他六大类组件都有共同的父类QWidget以及QObject,其中QObject 只有简单的属性objectName,而QWidget则有三十一项的设置属性,并且占了所有部件所有属性的大部分,因此组件属性的设置很大一部分就是对组件与QWidget类相关属性的设置。因此本节将详细介绍Qt Designer与QWidget类相关的组件属性的含义。

    二、 概述

    不同的组件类型,其与QWidget类相关属性在属性设置界面展示的属性有所区别,这是因为虽然所有属性都来自QWidget定义的属性,但不同组件功能方面的差异导致有些属性不需要使用(如组件的标题对按钮就没有作用),因此属性设置界面把与具体组件无关的QWidget属性屏蔽了,但窗口类应该是包含了所有其他组件都会引用的QWidget属性,因此我们接下来的介绍就是以新建窗口时选择Widget模板新建的窗口对应属性来介绍。

    Qt Designer新建窗口时的操作界面如下:
    在这里插入图片描述
    窗口新建完成后对应的属性编辑界面截图如下:
    在这里插入图片描述
    注意
    Qt Designer中可以设置的QWidget属性比QWidget类的属性要少,只是QWidget类属性的一个子集,下表是QWidget所有属性(其中标黄色的是属性编辑界面没有的属性)。

    QWidget属性列表

    在这里插入图片描述
    老猿没有仔细研究这些未出现在编辑界面的属性,只是大概看了下,发现没有出现的部分属性有几种情况:

    1. 相关属性包含在另外的属性中,如x、y、height、width属性包含在geometry 属性中,maximumWidth、maximumHeight 包含在maximumSize属性中等;
    2. 部分属性是只读的,是Qt系统设置的,不能设置,如sizeHint和minimumSizeHint等;
    3. 有些属性是通过其他属性计算得出的,如Rect可以通过geometry 的height、width属性得出;
    4. 有些属性是运行时的数据,无需设置,如focus、size、pos、visible、minimized 、maximized 等。

    因为没有研究不在属性设置界面的所有属性,只是针对其中简单的看了看,并没有将所有非界面属性都仔细研究,因此除了上述几种情况是否还有其他情况不能确认。

    Qt Designer中可以设置的QWidget属性共有31个,老猿将其分为四大类。

    在这里插入图片描述

    三、 组件大小及位置控制的属性

    组件大小控制的属性有geometry 、baseSize、sizeIncrement、minimumSize、maximumSize和sizePolicy,用于控制组件的初始大小以及动态调整大小的控制。属性配置界面的geometry 定义了组件的初始大小,其他属性都与组件大小调整时控制组件的大小相关。
    3.1、geometry属性
    geometry属性保存组件相对于其父级对象的位置和大小,Qt实际上是以一个长方形来表示组件的位置和大小的,包括左上角的坐标位置、长度和宽带。

    当组件的geometry调整时,组件如果可见将立即接收moveEvent事件和/或调整大小事件resizeEvent事件。如果件当前不可见,则保证它在显示之前接收适当的事件。如果组件的geometry被要求调整到超出minimumSize()和maximumSize()定义的范围之外时,则Qt会强制组件的大小必须在定义的范围内。

    可以使用geometry()查询该属性的值,使用setGeometry(int x, int y, int w, int h)或setGeometry(QRect )设置该属性的值。与此属性关联的函数有: frameGeometry()、rect()、move()、resize()、 moveEvent()、resizeEvent()、minimumSize()和 maximumSize()。

    注意:
    1、 大小的计数单位都是像素,相关数字不包括窗口框架占用的位置;
    2、 Qt中组件的坐标是以组件的左上角为原点、x轴向右、y轴向下的坐标体系。

    3.2、baseSize属性和sizeIncrement属性
    3.2.1、baseSize
    组件的 baseSize是组件的基础大小(单位:像素),如果组件设定了sizeIncrement,该属性用于在调整组件尺寸时计算组件应该调整到的合适值,但这个属性缺省值是QSize(0,0),需要使用setBaseSize(int basew, int baseh)设置该值,要查询该值使用baseSize()方法。

    3.2.2、sizeIncrement
    sizeIncrement表示组件调整大小时的每次变化的增量大小(单位:像素)的基数,实际调整大小计算公式如下:
    width = baseSize().width() + i * sizeIncrement().width()
    height = baseSize().height() + j * sizeIncrement().height()

    其中i,j为非负整数。

    sizeIncrement的缺省值是QSize(0,0),可以调用setSizeIncrement(QSize)、setSizeIncrement(int w, int h)设置sizeIncrement,调用sizeIncrement()获取sizeIncrement的值。

    注意:所有组件都可以设置sizeIncrement,但只有窗口对象会生效。

    3.3、mimimumSize属性和maximumSize属性
    3.3.1、mimimumSize
    mimimumSize表示部件能被缩小到的最小尺寸,单位为像素,缩小到该尺寸后不能再进一步缩小了。如果部件在布局管理器中,且布局管理器也设置了最小尺寸,则部件本身的最小尺寸以部件的mimimumSize为准,布局管理器设置的不起作用。

    部件的最小尺寸可以调用方法setMinimumSize(QSize)或setMinimumSize(int minw, int minh)进行设置,使用minimumSize()返回当前值,如果值被设置为QSize(0,0)则表示最小尺寸无效。

    3.3.2、maximumSize
    maximumSize表示部件能被放大到的最大尺寸,放大到该尺寸后不能再进一步放大了。部件的缺省最大值为QSize(16777215,16777215)
    部件的最大尺寸可以调用方法setMaximumSize(QSize)或setMaximumSize(int maxw, int maxh)进行设置,使用maximumSize()返回当前值,部件的最大值不能超过系统设置部件的最大值常量QWIDGETSIZE_MAX 。

    3.4、sizePolicy属性
    部件的sizePolicy属性用于说明部件在布局管理中的缩放方式,当部件没有在布局管理器中时,该设置无效。

    在理解sizePolicy前,先介绍两个Qt内置的部件属性sizeHint和minimumSizeHint,分别表示部件的缺省大小、minimumSizeHint建议最小尺寸。

    1、sizeHint:为布局管理器中部件的缺省大小,如果部件不在布局管理中就为无效的值,该值是Qt中对每个部件大小的建议值,也是缺省值,不能修改;
    2、minimumSizeHint:为Qt推荐的部件最小大小,如果部件不在布局管理中就为无效的值,在布局管理器中minimumSizeHint 就是部件的缺省最小值,除非当前部件的大小策略为QSizePolicy.Ignore或者minimumSize被设置,布局管理器不会调整一个部件的大小到比minimumSizeHint 返回值更小的大小。

    sizePolicy由四个值组成,分别是水平缩放策略、垂直缩放策略、水平伸缩因子、垂直伸缩因子。
    1、缩放策略
    水平缩放策略、垂直缩放策略的值都是枚举类型Policy,该枚举类型的取值及含义如下:
    在这里插入图片描述
    其中,相关值内的常量由枚举类型 QSizePolicy.PolicyFlag定义,对应取值及含义如下:
    在这里插入图片描述
    2、伸缩

    四、 界面响应事件控制属性

    界面响应事件控制属性是指针对组件对键盘、鼠标事件以及平板触控笔的事件响应的控制,它包括acceptDrops、contextMenuPolicy、cursor、enabled、focusPolicy、inputMethodHints、mouseTracking、tabletTracking、windowModality、windowTitle这9个属性。

    4.1、enabled属性
    enabled属性非常简单,最开始老猿没准备介绍该属性的,因为大家都应该知道,但仔细看了看官网文章,觉得还是有些细节可能很少有人注意到,因此还是在此介绍一下。

    enabled属性用于表示部件是否可用,一个可用的部件可以接收和处理鼠标和键盘事件,当部件不可用时则无法接收和处理鼠标和键盘事件。

    有些部件在被禁用时会以不同的方式显示自己。例如,按钮可能会将其标签灰显。如果部件需要知道它何时被启用或禁用,则可以使用changeEvent()方法来捕获事件,事件类型设置为QEvent.EnabledChange。

    禁用一个部件时会隐式禁用其所有子部件,启用部件时将顺序启用所有子部件,除非子部件已被显式禁用。当父部件保持禁用状态时,不可能显式启用不是窗口的子部件。

    enabled属性缺省值为True,可以 通过isEnabled()访问部件的启用状态,通过setEnabled(bool)设置部件的启用状态。

    4.2、acceptDrops属性
    acceptDrops属性表示当前部件是否接受鼠标拖放事件,鼠标拖放应该是与鼠标拖拽结合在一起的,在Qt Designer中可以通过属性acceptDrops设置部件是否接受鼠标拖放事件。如果部件接受拖放,则在鼠标拖放时,拖放事件会发送给鼠标当前光标下接受拖放的第一个部件。

    如果一个部件设置了acceptDrops属性为True,则就是通知系统该部件可能接受鼠标拖放事件。

    注意:
    1、如果当前部件是一个桌面(windowType() == Qt.Desktop), 如果此时另一应用正在使用桌面则这个属性设置可能失败;
    2、不要在拖、放事件的处理方法中修改该属性。

    使用acceptDrops()获取当前部件是否支持拖放;使用setAcceptDrops(bool on)设置当前部件是否支持拖放。

    4.3、contextMenuPolicy属性
    contextMenuPolicy为部件的快捷菜单策略,快捷菜单通过在部件上点击鼠标右键触发。

    快捷菜单策略通过枚举类型Qt.ContextMenuPolicy来定义,对应枚举类型取值及含义如下:
    在这里插入图片描述
    通过contextMenuPolicy() 可以获取当前部件的快捷菜单策略;通过setContextMenuPolicy(Qt.ContextMenuPolicy policy)可以设置当前部件的快捷菜单策略。

    4.4、focusPolicy属性
    在Qt Designer中可以设置部件的焦点策略,部件的焦点策略属性取值范围由枚举类型Qt.FocusPolicy来定义,该枚举类型及其含义如下表所示:

    在这里插入图片描述
    部件可以通过focusPolicy()可以获取当前部件的焦点策略,通过setFocusPolicy(Qt.FocusPolicy policy)设置焦点策略。

    4.5、mouseTracking和tabletTracking属性
    mouseTracking和tabletTracking这两个属性是跟踪鼠标或平板触控笔的移动轨迹的。

    4.5.1、mouseTracking
    mouseTracking属性用于保存是否启用鼠标跟踪,缺省情况是不启用的。没启用的情况下,对应部件只接收在鼠标移动同时至少一个鼠标按键按下时的鼠标移动事件,启用鼠标跟踪的情况下,任何鼠标移动事件部件都会接收。

    部件方法hasMouseTracking()用于返回当前是否启用鼠标跟踪,setMouseTracking(bool enable)用于设置是否启用鼠标跟踪。与鼠标跟踪相关的函数主要是mouseMoveEvent()。

    4.5.2、tabletTracking
    tabletTracking属性保存是否启用部件的平板跟踪,缺省是不起用的。没有启用平板跟踪的情况下,部件仅接收触控笔与平板接触或至少有个触控笔按键按下时的触控笔移动事件。
    如果部件启用了平板跟踪功能,部件能接收触控笔靠近但未真正接触平板时的触控笔移动事件,这可以用于监视操作位置以及部件的辅助操作功能(如旋转和倾斜),并为图形界面提供这些操作的信息接口。

    部件方法hasTabletTracking()用于返回当前是否启用平板跟踪,setTabletTracking(bool enable)用于设置是否启用平板跟踪。与平板跟踪相关的函数主要是 tabletEvent()。

    4.6、inputMethodHints属性
    inputMethodHints属性只对输入部件有效,输入法使用它来检索有关输入法应如何操作的提示,例如,如果设置了只允许输入数字的标志,则输入法可能会更改其可视组件,以反映只能输入数字。相关取值及含义如下:
    在这里插入图片描述
    输入提示是多种值的组合,多个值之间通过或操作组合。

    如果几个独占标志被放在一起,则生成的字符集将由指定集的并集组成。例如,指定ImhNumbersOnly 和ImhUppercaseOnly 将产生一个由数字和大写字母组成的集合。

    该属性缺省值为Qt.ImhNone,可通过inputMethodHints() 和setInputMethodHints(Qt.InputMethodHints )进行访问和修改。

    注意:
    1、 修改时最好先取到当前设置,再与要修改值进行或后再设置;
    2、 该属性仅作为一个输入提示,并不是所有输入法都会支持,老猿验证了几个中文输入法好像都不支持。

    老猿认为该属性没有多大用途,一是因为输入法不一定支持,二是因为并不能严格限制输入数据。

    4.7、cursor属性
    部件的cursor属性保存该部件的鼠标光标形状,当鼠标位于该部件上时就会呈现该属性设置的光标形状,对应类型为枚举类型Qt.CursorShape,可取值的范围及含义如下:
    在这里插入图片描述

    注意:
    1、上述列表中,最后4个取值在Designer中没有,这是因为这4个取值不是在属性编辑中静态设置的,而是在运行时调整的;
    2、上述列表中英文和译文都列出的是老猿花时间比较多的取值解释,但还是怕翻译得不够准确,所以列出英文进行对照。

    4.8、windowModality属性
    windowModality属性只对窗口对象有效,保存的是哪些类型的窗口被模式窗口阻塞。
    模式窗口防止其他窗口中的部件获取输入。此属性的值控制对应窗口可见时阻塞哪些类型的窗口获取输入。在模式窗口可见时更改此属性无效,必须先调用hide()隐藏模式窗口,然后再调用show()显示模式窗口。

    相关取值及含义如下:
    在这里插入图片描述

    五、 信息管理属性

    信息管理属性包括accessibleDescription、accessibleName、statusTip、toolTip、toolTipDuration、whatsThis、locale、windowFilePath、windowTitle这9个属性,这些属性与帮助、提示、窗口标题、残障人士辅助信息、语言国际化支持等方面,都与应用呈现给用户的文本信息有关,因此老猿将其归类到信息管理。

    5.1、locale国际化支持
    locale属性用于设置语言环境,包括语言和国家。如果一个部件没有设置语言环境,则使用父对象的语言环境或者默认语言环境(如果部件是顶层部件)。

    可以使用locale()获取部件的语言环境,也可以通过 setLocale(QLocale )设置部件的语言环境,还可以通过unsetLocale()取消部件的语言环境设置。

    5.2、 translatable、 disambiguation和comment子属性
    每个显示的文本信息包括Label的文本、按钮的文本等、以及输入控件的输入内容、帮助信息的文本等都可以在部件属性编辑中设置国际化子属性,如:
    在这里插入图片描述
    在这里插入图片描述
    它们都有三个子属性,分别是translatable、 disambiguation和comment,这三个属性的含义分别如下:
    1、translatable可译:表示对应属性文字不用翻译成其他语言;
    2、disambiguation消除歧义:这是当有多个需要翻译文字的对象有相同文字时,避免出现歧义而额外添加的消除歧义字符,缺省为空,一般歧义字符设置为其所在对象对应类的名字,此消歧参数是为转换器指定注释的首选方法。
    3、comment注释:添加注释用于辅助对属性文字的翻译,注释将在翻译属性文字时传递到翻译的函数tr()中并与需要翻译对象关联,这样会有助于理解翻译的文字含义。

    对于国际化,老猿没有研究过,也不准备去研究,之所以列这三个属性的国际化属性,纯粹是因为才开始老猿对这三个属性不知道,并且基本上查不到资料。没接触过的人看到这会一头雾水,因此通过各种方法查阅了很多资料,结合各种资料以及自己的理解单独在此解释一下,可能不完全正确。这这部分内容,无需国际化的人不需要关注,需要国际化的人则需要另外专门研究。

    5.3、toolTip、toolTipDuration、statusTip、whatsThis属性

    这几个属性与帮助和提示信息相关,除了toolTipDuration外,都有国际化设置的子属性。
    5.3.1、toolTip属性
    toolTip属性设置部件的toolTip提示信息,toolTip提示信息在鼠标放到控件上会浮动出一个小框显示提示信息。默认情况下,仅显示活动窗口子部件的toolTip,可以通过在窗口对象设置Qt.WA_AlwaysShowToolTips属性来改变,但不能是需要显示tooTip的部件对象中设置。

    如果要控制tooTip显示的行为(如控制显示位置),可以重写部件的event()方法捕获事件类型为QEvent.ToolTip的事件。

    缺省值为空,可以通过toolTip()和setToolTip( QString )来读取和设置toolTip。

    5.3.2、toolTipDuration属性
    toolTipDuration 属性控制toolTip显示的时长,单位是毫秒,如果设置为-1,则显示时长根据toolTip内容的长度来计算。
    toolTipDuration 缺省值为-1,可以通过toolTipDuration ()和settoolTipDuration ( int msec)来读取和设置toolTipDuration 。

    5.3.3、statusTip属性
    statusTip属性保存statusTip提示信息,statusTip提示信息在鼠标放到控件上时在窗口的状态栏显示提示信息,如果窗口无状态栏则不显示。

    statusTip属性 缺省值为空字符串,可以通过statusTip()和setstatusTip ( QString )来读取和设置statusTip。

    5.3.4、whatsThis
    whatsThis属性保存部件的帮助信息。whatsThis的帮助信息一般在部件获得焦点后按Shift+F1弹出显示,如果这个快捷键被别的功能占用,则whatsThis的帮助信息可能无法展示。有些对话窗提供一个带问号的按钮可以点击显示whatsThis的帮助信息。

    whatsThis属性 缺省值为空字符串,可以通过whatsThis()和setwhatsThis ( QString )来读取和设置whatsThis。

    5.4、accessibleDescription和accessibleName辅助阅读属性
    accessibleDescription和accessibleName属性都是用于残疾人辅助阅读的,这两个属性都有国际化属性。

    5.4.1 accessibleName属性
    这是辅助阅读中显示的部件的名称,对于大多数小部件,无需设置此属性,因为Qt会调用部件相关属性显示,如按钮将显示按钮的文本,但当小部件不提供任何文本时,设置此属性很重要。例如,只包含图标的按钮需要将此属性设置为与屏幕阅读器一起使用。

    此属性默认为空,通过accessibleName() 和setAccessibleName(QString )可以对该属性进行查询和设置。

    5.4.2 accessibleDescription属性
    此属性保存辅助技术所看到的部件描述,是对accessiblename的补充说明。

    此属性默认为空,通过accessibleDescription () 和setAccessibleDescription (QString )可以对该属性进行查询和设置。

    5.5、windowTitel属性
    windowTitle仅对window和dialog类型的对象生效。
    windowTitle是窗口的标题,可以通过windowTitle() 、setWindowTitle(const QString &)进行读取和设置。

    5.6、windowFilePath属性
    windowFilePath属性仅对窗口对象有效,用于关联一个窗口和对应的文件及路径。
    当窗口没有设置标题属性的情况下,则窗口标题展示展示windowFilePath对应的文件名的信息(路径信息不展示),如果二者都设置,则优先使用窗口标题属性的设置作为标题。

    该属性缺省为空,可以通过windowFilePath()和setWindowFilePath(QString )来访问和设置windowFilePath属性。

    这个功能在窗口打开文件进行操作时可以使用来标记打开的文件。

    注意该属性有国际化设置的子属性。

    六、 外观控制属性

    外观控制属性包括autoFillBackground、font、layoutDirection、palette、styleSheet、windowIcon、windowOpacity这七个属性,基本都与部件的外观相关。

    6.1、palette属性和字体font属性设置
    在Qt Designer的部件属性中,有个部件调色板(palette)的属性,进入后,如下图所示:
    在这里插入图片描述
    Qt中提供的调色板palette用于管理控件的一组外观显示设置组成,组中每条记录包括颜色角色、颜色组、具体颜色,对应PyQt中的QPalette类。QPalette类相当于对话框或控件的调色板,管理着控件和窗体的所有颜色。

    6.1.1、color role颜色角色
    上图中蓝色标记的color role颜色角色是指界面中颜色对应的部分界面外观组合,又称为颜色职责,即对应界面中哪些部分使用指定某个颜色。通过枚举变量QPalette.ColorRole来定义,取值及其含义如下:
    在这里插入图片描述
    6.1.2、颜色组ColorGroup
    颜色组是指对应同一外观组合在活动状态(active,指获得焦点 ) 、非活动状态(inactive,未获得焦点但可以获得焦点的状态 )、禁止状态(disable,不能获得焦点 )时的对应颜色。上图中只有active 状态的,其他两种状态颜色是电脑根据规则计算出来的,如果要查看或者设置颜色组的三种状态,在上图中选择“show details”即可,如下图:
    在这里插入图片描述
    上面两个截图中的预览窗口是调整调色板的设置后对一个作为案例的窗口外观影响的预览。

    6.2、字体设置
    在Qt Designer中部件的Font属性中可以设置对应部件的字体属性,包括字体的字体簇(Family)、大小(Size)、是否粗体(Bold)、是否斜体(Italic)、是否带下划线(Underline)、是否带删除线(Strikeout)、是否调整字符间距(Kerning,调整字形间距,且基本上是英文字符形状的间距,因为英文字符形状都是不规则的,有宽有窄,有的圆乎乎,有的棱角分明,就会导致排列在一起的时候疏密不一致,而kerning可以有效利用字符形状间的间隙,使字形之间的空间更加相似)、是否反走样抗锯齿(Antialiasing,请参考《QT QPainter::antialiasing QPainter::textAntialiasing 反走样、抗锯齿探究》)这些属性。

    注意:如果Qt Style Sheets与setFont()在同一个部件上使用,则如果设置冲突,样式表将优先。

    6.3、windowIcon属性
    windowIcon对象为部件对象的属性,但只有窗口对象有效,其他派生对象如pushButtong对象无效。

    在windowIcon对象上有如下子属性设置:
    在这里插入图片描述

    这几个子属性实际上是QIcon类中继承的。它们的含义如下:
    6.3.1、Theme(图标主题):图标主题是一组具有相同外观和感觉的图标,从程序员的角度来看,图标主题只是一个映射。给定一组要在其中查找图标的目录和一个主题名称,它将图标名称和标称图标大小映射到图标文件名。
    关于图标主题的内容老猿没有弄清楚,猜测可能是图标文件和目录以及大小有套规范,然后对应用指定主题,就可以在主题对应目录自动按照规范查找对应的图标。
    有几个网址可以参考一下:
    《Icon Naming Specification》https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html
    《Icon Theme Specification》https://specifications.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html

    6.3.2、Normal off…Selected On
    上图中所示的Normal off到Selected On这8个子属性应该是QIcon的两个属性的组合,分别指定部件在这8种状态下使用哪个图标。这两个属性分别是QIcon的如下两个枚举类型成员:
    1、enum Mode { Normal, Disabled, Active, Selected }
    四个值分别表示:
    1)QIcon.Normal:部件为使能状态,但未激活,没有获得焦点。
    2)QIcon.Disabled:部件为禁用状态。
    3)QIcon.Active:部件为激活状态,获得了焦点(如鼠标悬停在上面,或Tab键移动焦点)。
    4)QIcon.Selected:部件被选中。
    当部件的状态切换时,默认的图标绘制函数会自动根据部件的状态重绘图标。

    2、enum State { Off, On }
    某些部件还有所谓的开关状态(比如一个按钮可以有按下和弹起两个状态),则还可以根据 state 参数来选择不同的图像。

    因此上述两个类型的组合对应了8种状态就是Designer图标的8个子属性。

    注意:如果theme设置了,则优先使用theme去加载图标,只有找不到的情况下才使用下面每种状态的图标。

    6.4、windowOpacity属性
    这个属性仅对window对象生效。
    windowOpacity为浮点数,表示透明度,为1完全不透明,为0完全透明,缺省是1。

    可以通过windowOpacity()、setWindowOpacity(qreal level)进行读取和设置。

    6.5、layoutDirection属性
    layoutDirection属性保存的是部件的布局方向,有三个取值:
    在这里插入图片描述
    在部件上设置布局方向时,它将传播到部件的子级,但不会传播到作为窗口的子级,也不会传播到已显式调用setLayoutDirection()的子级。此外,为父级调用setLayoutDirection()之后添加的子部件不会继承父级的布局方向。

    在Qt Designer中修改了一个部件的布局方向时,所有未单独设置布局方向的子部件的布局方向全部跟随调整,单独设置了不跟随调整。

    注意
    1、自qt 4.7以来,此方法不再影响文本布局方向;
    2、此属性调整只影响布局内的部件排列,不影响绝对部件的部件排列;
    3、布局方向调整在Designer设计时立即生效,无需到运行时。

    案例
    1、 如下图,窗口布局类型为从左到右,下面六个按钮的排列显示为:
    在这里插入图片描述
    2、 调整窗口的布局方向为从右到左,则六个按钮的排列显示为:
    在这里插入图片描述
    可以看到1、 2、3号三个按钮由于是绝对布局,两种排列方向其界面上的顺序没有变化,而4、 5、 6在布局中,两种排列方向的按钮顺序颠倒了。

    请注意:窗口的主菜单也靠右排列了。

    6.6、 autoFillBackground属性
    autoFillBackground属性可以确认部件背景是否自动填充,如果自动填充,Qt会在调用Paint事件之前填充部件的背景。使用的颜色由部件调色板中的QPalette.window 颜色角色定义。

    此外,除非设置了WA_OpaquePaintEvent 或 WA_NoSystemBackground属性,否则窗口始终使用QPalette.Window对应颜色填充。

    如果部件的父级对象背景具有静态渐变,则无法关闭此属性(即不能设置为False)。

    警告:在使用Qt Style Sheets时请小心使用此属性。当部件具有具有有效背景或边框图像的样式表时,此属性将自动禁用。

    默认情况下,此属性为False。

    可以使用autoFillBackground()和setAutoFillBackground(bool enabled)对该属性进行读取和设置。

    6.7 styleSheet属性
    styleSheet属性是定义部件外观的属性样式表,在Qt中styleSheet样式表是类似于html的css样式一样的方法,只是时专门为Qt中的部件开发的。styleSheet的定义语法也是类似CSS,并且是跨平台支持的。

    由于每个部件都可以定义自己的样式,也可以通过QApplication.setStyleSheet()在整个应用程序上设置样式。如果在不同级别设置了多个样式表,qt将从所有设置的样式表中派生出有效的样式表。这叫做样式级联。

    6.7.1、Qt Designer中定义样式
    在部件的styleSheet属性中,点击属性进入属性设置,会出现如下内容:
    在这里插入图片描述
    点击省略号的按钮,则进入样式编辑器:
    在这里插入图片描述
    6.7.2、styleSheet样式表
    样式表由一系列样式规则组成。样式规则由选择器和声明组成。选择器指定哪些部件受规则影响;声明指定应在部件上设置哪些属性。如:

    QPushButton { color: red }
    

    在上面这个样式规则中,QPushButton 是选择器,{ color: red }就是声明,表示所有QPushButton 按钮及其派生类对象的文本颜色设置为红色。如果该规则样式表应用在窗口上,则窗口上所有没有指定styleSheet的pushButton部件的文字颜色会显示为红色,通过styleSheet指定了color的则按自己指定颜色显示。
    在这里插入图片描述
    上述截图的窗口定义了样式:QPushButton { color: red },而PushButton3则定义了样式:QPushButton { color: blue},因此展示效果如上。

    注意:在Qt样式定义语句中,通常情况下是大小写都可以,但类名、对象名和Qt属性名是大小写敏感的。
    因此QPushButton { color: red },也可以写成:QPushButton { Color: Red }、QPushButton { COLOR: RED}、QPushButton { Color: REd}等形式,但不能写成qpushbutton { color: red }、QPUSHBUTTON { color: red }等形式。

    关于Qt样式表的详细语法规则请见Qt文档官网《The Style Sheet Syntax》。

    可以使用styleSheet() 、setStyleSheet(QString )来获取或设置部件的样式表。

    七、 后记

    终于将Qt Designer中与QWidget类相关的属性介绍完了,从9月下旬开始学习PyQt的GUI程序开发,刚使用Qt Designer设计GUI界面时,对于桌面上那么多控件一个个都不了解,到处找资料,基本没有全面介绍界面控件的,单个的控件有些能找到一些内容,但都不够详细,有些根本就没有。后来终于找到了Qt文档官网的地址(https://doc.qt.io/qt-5/reference-overview.html),能解决将近80%的问题,但可能还有20%的问题解决不了,这20%总结来包括如下一些方面:
    1、 在国内相对冷门且不好验证的知识,如国际化、输入法提示等;
    2、 一些可能是常识性的东西,没有人解释,官网上也没有,但就是不理解,如焦点策略的鼠标滚轮获得焦点必选是鼠标已经在控件之上才行、what’s this怎么触发;
    3、 一些英文怎么翻译才好理解,如本节部分表格中有中英文对照的内容、Dock Wigdet是否该翻译成停靠部件等;
    4、 还有一些验证时有时不成功有时不能成功的,如布局控件内部件的从右往左对齐方向对主窗口菜单的影响试了几次有不同的效果,也不知道原因。

    好歹经过多方查找各种资料、测试验证,绝大部分问题都弄清楚了,可能还有极个别的没有完全理解透彻。从9月下旬开始,断断续续的将来源于QWidget类且在Qt Designer中属性编辑可见的属性的功用逐个再次总结记录下来,又花了三天时间整理成本文的内容,并将这些属性进行了分类。因此本文绝对不是简单的翻译或资料汇聚,是老猿前后花了近20天心血研究、整理的产物,还有少数几个细节问题没有完全弄透彻,但就整体来说,对初学者应该是基本够用了,希望帮助到大家。


    博客地址:https://blog.csdn.net/LaoYuanPython

    老猿Python博客文章目录:https://blog.csdn.net/LaoYuanPython/article/details/98245036

    展开全文
  • 继承的概念:继承是指之间的继承关系 ,子类继承父类,子类可以将父类的属性方法继承下来,现实生活继承指的是对象与对象的继承关系,程序间的继承是指之间的继承关系。继承关系的梳理:A是B(is ...
    继承的概念继承是指类与类之间的继承关系 ,子类继承父类,子类可以将父类的属性方法继承下来,现实生活中继承指的是对象与对象的继承关系,程序间的继承是指类与类之间的继承关系。继承关系的梳理:A类是B类(is a),如果这样能够说通,则两个类就可以建立继承关系。以下代码是了车类与出租车类 共同继承了Car属性 
    展开全文
  • 彻底搞懂Python类属性和方法的调用

    千次阅读 多人点赞 2020-03-29 15:22:35
    Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python创建一个和对象是很容易的。 一、、对象概述 在面向对象程序设计,把数据...1.数据抽象:描述对象共有的属性或状态。 2.过程抽象:...

    Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。

    一、类、对象概述

    • 在面向对象程序设计中,把数据以及对数据的操作封装在一起,组成一个整体(对象),不同对象之间通过消息机制来通信或者同步。对于相同类型的对象进行分类、抽象后,得出共同的特征而形成了
    • 类的抽象具体包括两个方面:
      1.数据抽象:描述某类对象共有的属性或状态。
      2.过程抽象:描述某类对象共有的行为或功能操作。
    • 在python中,使用类来定义同一种类型的对象。类是广义的数据类型,能够定义复杂数据的特性,包括:
      1.静态特性(即数据抽象):创建类时用变量形式表示对象特征的成员称为属性(数据成员)
      2.动态特性(即行为抽象,也就是对数据的操作方法):用函数形式表示对象行为的成员称为成员方法,数据成员和成员方法统称为类的成员。
    • 类是实现代码复用和设计复用的一个重要方法,封装、继承、多态是面向对象程序设计的三个要素。
    • 类是生成对象的抽象模板,对象是根据类创建出来的一个个具体的实例。

    二、类的定义与使用

    • Python使用class关键字来定义类,class关键字之后是一个空格,接下来是类的名字,如果派生自其它基类的话则需要把所有父类放到一对圆括号中并使用逗号分隔,然后是一个冒号,最后换行并定义类的内部实现。
    • 类名的首字母一般要大写
    class Car(object):              #定义一个类,派生自object类(所有类的祖先,定义类时不存在其他父类就写object)
    	can_move=True               #定义类属性
        def infor(self):            #定义成员方法
            print("This is a car")
    
    • 类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self(self代表类的实例,而非类;self 不是 python 关键字,我们把他换成其他也是可以正常执行的)。

    三、类属性和类方法的调用

    定义了类之后,就可以用来实例化对象,并通过“对象名.成员”的方式来访问其中的数据成员或成员方法。

    >>>spring=Bird()                        #实例化对象
    >>>print(Bird.have_feather)             #通过类名调用属性
    >>>print(Bird.have_head)                #通过对象名调用属性
    >>>spring.move()                        #通过对象名调用方法
    >
    

    在这里插入图片描述
    在这里插入图片描述

    • 类方法大体分为 3 类,分别是类方法、实例方法和静态方法,其中实例方法用的是最多的。我们知道,实例方法的调用方式其实有 2种,既可以采用类对象调用,也可以直接通过类名调用。

    通常情况下,我们习惯使用类对象调用类中的实例方法。但如果想用类调用实例方法,不能像如下这样:

    class Study:
        def info(self):
            print("学 Python")
    #通过类名直接调用实例方法
    Study.info()
    

    运行上面代码,程序会报出如下错误:

    Traceback (most recent call last):
      File "D:\python3.6\demo.py", line 5, in <module>
        Study.info()
    TypeError: info() missing 1 required positional argument: 'self'
    

    其中,最后一行报错信息提示我们,调用 info() 类方式时缺少给 self 参数传参。这意味着,和使用类对象调用实例方法不同,通过类名直接调用实例方法时,Python 并不会自动给 self 参数传值。
    读者想想也应该明白,self 参数需要的是方法的实际调用者(是类对象),而这里只提供了类名,当然无法自动传值。

    因此,如果想通过类名直接调用实例方法,就必须手动为 self 参数传值。例如修改上面的代码为:

    class Study:
        def info(self):
            print("学 Python")
    clang = Study()
    #通过类名直接调用实例方法
    Study.info(clang)
    

    再次运行程序,结果为:

    学 Python
    

    可以看到,通过手动将 clang 这个类对象传给了 self 参数,使得程序得以正确执行。实际上,这里调用实例方法的形式完全是等价于 clang.info()。

    值得一提的是,上面的报错信息只是让我们手动为 self 参数传值,但并没有规定必须传一个该类的对象,其实完全可以任意传入一个参数,例如:

    class Study:
        def info(self):
            print(self,"学 Python")
    #通过类名直接调用实例方法
    Study.info("zhangsan")
    

    运行结果为:

    zhangsan 学 Python
    

    可以看到,“zhangsan” 这个字符串传给了 info() 方法的 self 参数。显然,无论是 info() 方法中使用 self 参数调用其它类方法,还是使用 self 参数定义新的实例变量,胡乱的给 self 参数传参都将会导致程序运行崩溃。

    总的来说,Python 中允许使用类名直接调用实例方法,但必须手动为该方法的第一个 self 参数传递参数,这种调用方法的方式被称为“非绑定方法”。
    用类的实例对象访问类成员的方式称为绑定方法,而用类名调用类成员的方式称为非绑定方法。
    (此处参考)

    四、私有成员与公有成员

    • 私有成员在类的外部不能直接访问,一般是在类的内部进行访问和操作,或者在类的外部通过调用对象的公有成员方法来访问,而公有成员是可以公开使用的,既可以在类的内部进行访问,也可以在外部程序中使用。
    • 从形式上看,在定义类的成员时,如果成员名以两个下划线开头但是不以两个下划线结束则表示是私有成员,否则就不是私有成员。
    • Python并没有对私有成员提供严格的访问保护机制,通过一种特殊方式“对象名._类名__xxx”也可以在外部程序中访问私有成员,但这会破坏类的封装性,不建议这样做。

    • 在Python中,以下划线开头的变量名和方法名有特殊的含义,尤其是在类的定义中。
    _xxx:受保护成员;
    __xxx__:系统定义的特殊成员;
    __xxx:私有成员,只有类对象自己能访问,子类对象不能直接访问到这个成员,但在对象外部可以通过“对象名._类名__xxx”这样的特殊方式来访问。
    
    • 注意:Python中不存在严格意义上的私有成员。
    展开全文
  • 但是有些概念又是一时半会讲不清楚,所以笔者尽量找到简练形象的描述,并附上参考链接。  对象 属性 方法 实例   (1) - 《零基础学python》(第二版):https://docs.pythontab.com/learnpython/206/ ...
  • 目录 面向对象编程 常用术语/名词解释 抽象/实现 封装/接口 ...私有属性和公有属性 ... ...创建 ...类属性 ...的数据属性 ...的方法属性(函数属性) ...查看属性 ...在构造器首先设置实例属性 默认参
  • Python及常见的方法属性定义

    千次阅读 2018-04-27 17:48:19
    Python及常见的方法属性定义Python是一门完全面向对象(OOP)的语言,对于Python来说,一切皆对象, 一切皆对象,猫,老虎,狗,狼这些都是我们认识的一种动物,在现实生活我们把它叫做动物,而在面向对象的编程...
  • AD域常见属性名词解释

    万次阅读 2015-05-20 09:00:32
    AD域常见属性名词解释 Active Directory(AD)活动目录 schema对象模型 Organizational Unit(OU)组织单位 Distinguished name(DN)识别名 Canonical Name(CN)正式名称 Domain Controllers(DC)域控制...
  • 如何对属性进行校验呢 比如有个要保证 age 属性 它只能是int类型且大小处于0到100之间? 第一直觉就是用get 和set 方法如下: 1.基本的调用 set 和get 方法 class Student: def __init__(self): pass def get...
  • placeholder="..." 属性提供可描述输入字段预期值的提示信息(hint)。 是HTML5的新属性。 该提示会在输入字段空时显示,并会在字段获得焦点时消失。 注释:placeholder 属性适用于以下的 类型:text, search,...
  • HTML5meta属性的使用详解

    万次阅读 多人点赞 2015-05-29 10:45:13
    meta属性在HTML占据了很重要的位置。如:针对搜索引擎的SEO,文档的字符编码,设置刷新缓存等。虽然一些网页可能没有使用meta,但是作为正规军,我们还是有必要了解一些meta的属性,并且能够熟练使用它们。 1、...
  • BGP的汇总、属性分类、团体属性

    万次阅读 2010-05-21 10:22:00
     A:公认强制:这些属性必须出现的路由描述中,而且必须识别:as-path;next-hop;起源;  B:公认自觉:在路由描述中可以出现也可以不出现,但必须识别:本地优先级  (2)可选的:不一定所有的路由器都支持,  A...
  • 场景描述:门户网站提供apk文件的下载功能,同时需要记录下载日志。这时候在标签的href属性指定资源服务器上提供下载静态资源的URL,同时添加onclick事件用来记录下载日志。 问题:记录日志的ajax请求在firebug...
  • C++如何创建一个

    千次阅读 2019-10-12 10:59:56
    把对象共同的特征抽象为属性(成员变量) 共性 成员变量 用来 描述事物的特征 3.里的函数 里面的函数 即方法 成员方法(函数) 把对象共同的行为抽象方法(函数) 成员方法 用来 描述事物的行为 4.创建...
  • Java (1)写一个,名Animal, 该有两个私有属性,name(代表动物的名字),和legs(代表动物的腿的条数);要求两个私有属性提供public的访问方法。并提供两个重载的构造方法,一个需要两个参数,分别用这两个参数...
  • Java的基本操作单元 - 和对象

    千次阅读 多人点赞 2020-02-26 18:51:25
    文本关键字:属性、行为、实例化、对象。说到和对象,这都是两个比较抽象的词,如果用在程序,那就更不知道是什么意思了。其实大家可以先不联系程序,我们在对一大堆东西分类的时候自然是有一个标准的,符合...
  • 面向对象这个概念在很多语言中都有接触过,尤其在c++这个概念就是整个语言的核心。那什么是面向对象?也许我们对它都有个似懂非懂的概念,但无法完全清晰的理解。本文先大概描述面向对象的概念,再通过一个例子来...
  • 上一篇分析了什么是,并例举了一些例子,这里在继续对进行...前面说过,在描述java语法时,方括号的内容都是可以省略掉的。实际上任何程序设计相关语法都是如此,这是国际通行的标准。那么,要定义一个最简单的
  • 数据库学习3-列属性(字段属性

    千次阅读 2021-01-14 16:07:18
    属性又称为字段属性,在mysql中共有6个属性,null,默认值,列描述,主键,唯一键和自动增长 null属性 null属性,代表字段空 如果对应的值YES表示该字段可以空值 注意: 在设计表的时候,尽量不要让...
  • Java反射实体类属性(get ,set方法)

    千次阅读 2012-10-24 14:15:01
    反射授予了你的代码访问装载进JVM内的Java的内部信息的权限,并且允许你编写在程序执行期间与所选择的的一同工作的代码,而不是在源代码。这种机制使得反射成为创建灵活的应用程序的强大工具,但是要小心的是...
  • 文章目录包包(package)的作用JDK主要的包包的命名规范导入(import)方法方法的使用方法的重载(Overload)以及方法的重写(Override)对象(Object)和(class)面向过程和面向对象对象的本质对象和的概念的定义...
  • android 控件属性大全

    千次阅读 2018-06-06 16:26:59
    “Android控件属性大全”: &nbsp; 关键词:android&nbsp;控件&nbsp;属性&nbsp;...控件属性: ...android属性 ...第一:属性true或falseandroid:layout_centerhrizontal&nbsp;&nbs...
  • 一、问题描述 问题很简单:input和textarea包含其中的placeholder的自带属性实在有点闹心,因此需要对它们超微美化一下。然而问题就来了。 先附效果图: firefox下是这样子滴~ ie: 最后是chrome: ...
  • 2) 在系统,每个具有一定的职责,职责指的是所担任的任务,即要完成什么样的功能,要承担什么样的义务。一个可以有多种职责,设计得好的一般只有一种职责,在定义的时候,将的职责分解成为属性...
  • ALV的fieldcat常用字段属性选项大全

    万次阅读 2017-05-09 15:49:07
    字段目录是用来控制ALV显示的网格每个字段的属性的,比如字段的顺序,对齐方式,可编辑状态,颜色,等等.常用的字段如下: row_pos: 默认值0,可选值1、2、3,既最大分3级别显示 fieldname 字段的名字(内表...
  • java提高篇(四)-----抽象与接口

    万次阅读 多人点赞 2013-10-18 21:04:13
    接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。  抽象与接口是java语言对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力。他们两者之间对抽象概念的支持...
  • 一、图像常用属性本节指的是一般来说,图像处理的一些角度,也是根据一些美图软件最为关注的一些图像属性: 基本属性:图像亮度,对比度,色彩饱和度,清晰度(锐度) 色阶:曝光、高光、阴影 颜色:色温、色调 . 1...
  • JAV中类、实例与Class对象

    千次阅读 2020-05-06 15:35:58
    JAV中类、实例与Class... 简单理解,就是new,就是对的实例化,创建这个对应的实际对象,只是对事物的描述,而实例化就相当于这个描述新开辟了一块内存,可以改变这块区域里的各种属性(成员变量),当然...
  • 文本分类的降维方法总结

    万次阅读 2017-08-18 11:16:11
    人们通常采用向量空间模型来描述文本向量,但是如果直接用分词算法和词频统计方法得到的特征项来表示文本向量的各个维,那么这个向量的维度将是非常的大。 这种未经处理的文本矢量不仅给后续工作带来巨大的计算...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 134,526
精华内容 53,810
关键字:

共同属性被描述为类中的