Python类的高阶知识

一、 类的方法及属性权限控制

1、 类的方法:类名调用

a) Python3面向对象的概念中,关于类的方法一共有四种:

● 实例方法( 普通方法)-使用频次最多;对象名调用
● 类方法( @classMethod )-根据需求适度;类名调用
● 静态方法(@staticMethod )-根据需求适度;不含对象本身,不含对象属性或方法,速度快

b) 三种方法的区别:

● 定义语法格式上;
● 对各种类型变量的访问权限上。

2、 实例方法:实例对象名调用

● 实例方法是属于实例对象的,但也可以使用类直接调用。但两者调用的方式有区别(传递参数个数上面)。
● 实例方法在定义中,第一个参数必须为self(当然参数名称也可以随意定义,但是self 是python默认的规定最好不修改)。
● 实例方法定义的语法规范︰

def 方法名称(self [, arg1[, arg2,....[,argN]]]):
    pass

3、 类的初始化方法:def init(self): … …

该方法在类实例化对象过程中自动调用,也叫做构造方法,其作用有两个:
1、 为对象创建内存空间;
2、 实例对象的实例变量参数初始化。

4、 实例对象输出方法:def str(self): … …

该方法默认输出对象的十六进制内存地址,也可以自定义设置返回输出值;
这在Django的ORM创建数据表的时候,一般设置返回的字段。

5、 类的私有方法

某些对象(属性、方法、函数、类等)只能够在某个范围内访问,出了这个范围就不能访问了,这是“公”、“私”之分。
此外,还会专门为某些特殊的东西指定一些特殊表示,比如类的名字用 class,方法用 def,这就是保留字。
除了保留字,Python 中还为类的名字做了某些特殊准备,就是“专有”的范畴。

以“__”双划线开头的,将这类命名的函数/方法称之为“私有函数”。所谓“私有”,即:

● 私有函数不可以从它们的模块外面被调用
● 私有类方法不能够从它们的类外面被调用
● 私有属性不能够从它们的类外面被访问

跟私有的对立面就是公有;有的编程语言(如Java、C)用特殊的关键词来说明某函数或方法或类是私有还是公有。
如果一个 Python 方法、类方法或属性的名字以两个下划线开始,但不是结束,则它是私有的,否则,是公有的。类方法或者是私有 (只能在它们自已的类中使用) 或者是公有 (任何地方都可使用)。例如:

class Person:
    def __init__(self,name):
        self.name = name
    def __work(self,salary):
        print "%s salary is:%d"%(self.name,salary)

二、 类的内置魔法方法

三、 类的内置装饰器

1、 @property 与 @属性.setter: 返回和设置属性值(私有属性亦可以)

用法:

-*- coding:utf-8 -*-
import sys

from PySide2.QtWidgets import *


class Example(QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):
        # 实例化对象
        self.qhbox_main = QHBoxLayout(self)
        self.qhbox = QHBoxLayout()
        self.label = QLabel("LabelText1")
        self.line_edit = QLineEdit()
        self.qhbox.addWidget(self.label)
        self.qhbox.addWidget(self.line_edit)
        self.qhbox_main.addLayout(self.qhbox)

        self.__vh_layout = "horizontal"

    @property
    def vh_layout(self):
        return self.__vh_layout

    @vh_layout.setter
    def vh_layout(self, value):
        if value not in ["vertical", "horizontal"]:
            raise Exception("参数设置错误!")
        else:
            self.__custom_layout(value)
        self.__vh_layout = value

    def __custom_layout(self, value):
        if value == "vertical":
            self.qhbox.deleteLater()
            self.qvbox = QVBoxLayout()
            self.qvbox.addWidget(self.label)
            self.qvbox.addWidget(self.line_edit)
            self.qhbox_main.addLayout(self.qvbox)
        else:
            self.qvbox.deleteLater()
            self.qhbox = QHBoxLayout()
            self.qhbox.addWidget(self.label)
            self.qhbox.addWidget(self.line_edit)
            self.qhbox_main.addLayout(self.qhbox)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Example()
    print(window.vh_layout)
    window.vh_layout = "vertical"
    print(window.vh_layout)
    window.show()
    sys.exit(app.exec_())

四、 Python内置函数

1、 repr()

在 Python 中要将某一类型的变量或者常量转换为字符串对象通常有两种方法,即str() 或者 repr() 。

"""
str与repr的区别
"""

lst = ["sx", "we", "ff"]
string = 'dsa'

print(lst)
print(str(lst))
print(repr(lst))
print('\n')
print(string)
print(str(string))
print(repr(string))

# 结果:
# ['sx', 'we', 'ff']
# ['sx', 'we', 'ff']
# ['sx', 'we', 'ff']
# dsa
# dsa
# 'dsa'