目录 一:绑定方法 1.绑定给对象的方法 2.绑定给类的方法 3.非绑定方法之静态方法 二,隐藏属性 1.如何隐藏属性 三,property 装饰器 一:绑定方法 1.绑定给对象的方法 class Person: # 绑定给对象的方法 对象调用 自动把对象传入 def print_name(self): print(self.name) print('对象的绑定方法') p = Person() p.name = 'lqz' # 对象来调用对象的绑定方法 自动将对象传入 p.print_name…
一.绑定方法与非绑定方法 1.绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入): (1)绑定给对象的方法:在类内部定义的函数(没有被任何装饰器修饰的)默认就是绑定给对象用的. (2)绑定给类的方法:在类内部定义的函数如果被装饰器@classmethod修饰,则是绑定给类的,应该由类来调用, 调用时将类作为第一个参数自动传入. 绑定方法的精髓在于=========自动传值. class Foo: def f1(self): # 绑定给对象的方法 print('对象') @classm…
Python使用property函数和使用@property装饰器都能定义属性的get.set及delete的访问方法,他们的相同点主要如下三点: 1.定义这些方法后,代码中对相关属性的访问实际上都会触发这些定义的方法,从而实现应用代码用简单方法访问属性,但实际属性的访问逻辑由背后定义的方法控制,本质上二者的功效是相同的: 2.二者在定义方法上,都支持可以选择性的设置其中的一个.两个或三个操作类型: 3.定义的属性都必须是新增的属性,最好不能与类已有的实例变量同名,如果同名,该属性会覆盖原有实例…
原贴:为什么Python不需要getter和setter getter 和 setter在java中被广泛使用.一个好的java编程准则为:将所有属性设置为私有的,同时为属性写getter和setter函数以供外部使用. 这样做的好处是属性的具体实现被隐藏,当未来需要修改时,只需要修改getter 和 setter即可,而不用修改代码中所有引用这个属性的地方.可能做的修改为: 在获取或设置属性时打一条日志 设置属性时,对值对进检查 设置发生时, 修改设置的值 获取属性时,动态地计算值 可谓是好处…
class Kls(object): def __init__(self, data): self.data = data def printd(self): print(self.data) @staticmethod def smethod(*arg): print('Static:', arg) @classmethod def cmethod(*arg): print('Class:', arg) >>> ik = Kls(23) >>> ik.printd()…
上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一.    案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只定义了长度属性的操作.包括三个完整的装饰器,如果大家想试一下少一个操作方法的装饰器,可以直接把对应装饰器去除即可. 二.    案例代码 1.    定义类Rectangle class Rectangle():     def __init__(self,length,width): self.w…
第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰器相关的内容,在后面将单独的章节来介绍.Python总共包括三个内置装饰器(注意abstractmethod这个装饰器是从abc模块导入的,不是内置的),除了前面介绍的类方法装饰器classmethod.静态方法装饰器staticmethod外,还有一个property装饰器,这个装饰器与prope…
在创建实例属性时,如果直接把实例属性暴露出去,虽然写起来简单,但是存在一些风险,比如实例属性可以在外部被修改. 为了限制外部操作,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,在这些方法中还可以增加一些检查操作,比如在get_score中增加获取权限操作,在set_score中增加输入检查操作. class Student(object): def __init__(self): self._score = 60 def get_score(sel…
目录 python中@property装饰器的使用 1.引出问题 2.初步改善 3.使用@property 4.解析@property 5.总结 python中@property装饰器的使用 1.引出问题 在为一个类实例绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改,甚至类型错误都可以. class Student(object): def __init__(self, score): self.score = score if __name…
目录 封装 1.封装的定义 2.封装的目的: 3.封装的三种方式 4.封装的优点 5.访问限制(封装) @property 装饰器 属性property底层实现 封装 1.封装的定义 将复杂的丑陋的,隐私的细节隐藏到内部,对外提供简单的使用接口, 对外隐藏内部实现细节,并提供访问的接口; 2.封装的目的: 封装的目的: 面向对象的核心是对象二字,精髓在于整合,封装的目的其实就是把一堆数据属性和方法属性整合到对象中,我们可以把对象比喻成一个容器,其实就是为了把数据存入一个容器中.存的目的就是为了取…
一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解>中介绍了两种设置属性访问方法,通过设置可以在相关属性访问时调用对应的方法执行访问,支持属性简单访问(如对象名.属性名.赋值语句).或者为了控制访问逻辑使用的.那么property函数其中的fget.@property装饰器的getter之间的关系是怎样的呢?下面我…
Python的@property装饰器用来把一个类的方法变成类的属性调用,然后@property本身又创建了另一个装饰器,用一个方法给属性赋值.下面是在类中使用了@property后,设置类的读写属性,只读和只写属性. all方法设置的是读写属性,可以设置这个属性,也可以读取这个属性,如28行所示,如果没有定义__init__()方法的话,只能首先设置了这个属性才能使用这个属性.在32行中,如果想知道write属性的值,也是会报错的.而在34行中,也是没有办法继续给readonly这个制度属性赋…
概要: 组合 封装 property装饰器 多态 Python推崇鸭子类型:解耦合,统一标准(不用继承) 1. 组合 继承:会传递给子类强制属性 组合:解耦合,减少占用内存.如:正常继承,如果一个班级有100个学生,那么这个学生的重复的课程信息会存一百遍,浪费内存 一个对象有一个属性,该属性的值是来自于另外一个类的对象 2. 封装 装指的是将属性装进一个容器 封指的是将容器内的属性隐藏起来 如何做到"封":在属性名前加上__开头,特点如下: 1. __开头的属性会在检测语法时发生变形,…
# 需要了解的property的用法 class People: def __init__(self,name): self.__name=name @property def name(self): return '<name:%s>' %self.__name @name.setter def name(self,new_name): if type(new_name) is not str: print('名字必须是str类型') return self.__name=new_name…
一:组合: 什么是组合:组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象. 为何要用组合:通过为某一个对象添加属性(属性的值是另外一个类的对象)的方式,可以间接地将两个类关联/整合/组合到一起 从而减少类与类之间代码冗余 二:多态与多态性 什么是多态:多态指的是同一种/类事物的不同形态. 为何要用多态:                          多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象                          多态性…
组合的应用: 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 3. 如何用组合 '''class Foo: aaa=1111 def __init__(self,x,y): self.x=x self.y=y def func1(self): print('Foo内的功能') class Bar: bbb=2222 def __init__(self, m, n): self.m = m self.n = n def…
首先,property装饰器是通过数据描述符实现的.用法很简单,大家应该都知道,这里就不细说了. 这里主要分析一下property是如何通过描述符实现的. class Property: def __init__(self, fget): self.fget = fget # 为实例增加方法,这里的方法是未绑定实例的,不会自动传入实例self self.fset = None # 同上,未绑定实例 def __get__(self, instance, owner): if instance i…
# 组合'''软件重用的重要方式除了继承之外还有另外一种方式,即:组合组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 3. 如何用组合# obj1.xxx=obj2'''''' >>> class Equip: #武器装备类 ... def fire(self): ... print('release Fire skill') ... >…
1.组合 什么是组合? 一个对象的属性是来自另一个类的对象,称之为组合 为什么要用组合 组合也是用来解决类与类代码冗余的问题 3.如何用组合 # obj1.xxx=obj2''''''# class Foo:# aaa=1111# def __init__(self,x,y):# self.x=x# self.y=y# def func1(self):# print('foo中的功能')## class Bar:# bbb=2222# def __init__(self, m, n):# sel…
property() 函数作用于新式类,返回属性值. class C(object): def __init__(self): self._x = None def getx(self): print('get') return self._x def setx(self, value): print('set') self._x = value def delx(self): print('del') del self._x x = property(getx, setx, delx, "I'…
Python内置的@property装饰器可以把类的方法伪装成属性调用的方式.也就是本来是Foo.func()的调用方法,变成Foo.func的方式.在很多场合下,这是一种非常有用的机制. class People: def __init__(self, name, age): self.__name = name self.__age = age @property def age(self): return self.__age @age.setter def age(self, age):…
要了解@property的用途,首先要了解如何创建一个属性. 一般而言,属性都通过__init__方法创建,比如: class Student(object): def __init__(self,name,score): self.name=name self.score=score 创建实例,运行结果: tim=Student('Tim',97) tim.score=100 tim.score 100 mary=Student('Mary',90) mary.score 90 但是这样子有2…
一.多态与多态性 1.什么是多态 多态指的是同一种类/事物的不同形态 class Animal: def speak(self): pass class People(Animal): def speak(self): print('say hello') class Dog(Animal): def speak(self): print('汪汪汪') class Pig(Animal): def speak(self): print('哼哼哼') 多态 2.抽象类 只是用来建立规范的,不能用来…
一.组合二.封装三.property装饰器四.多态 一.组合 ''' 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 3. 如何用组合 ''' # class Foo: # aaa=1111 # def __init__(self,x,y): # self.x=x # self.y=y # # def func1(self): # print('Foo内的功能') # # # class Bar: # bbb=2222…
一.组合 二.封装 三.propert装饰器 四.多态 一.组合 ''' 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 3. 如何用组合 ''' # class Foo: # aaa=1111 # def __init__(self,x,y): # self.x=x # self.y=y # # def func1(self): # print('Foo内的功能') # # # class Bar: # bbb=22…
组合.多态.封装.property装饰器 一.组合 1.什么是组合 组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 class Foo(): pass class Bar(): pass obj=Bar() obj.attrib=Foo() 组合 2.组合的作用 通过为某一个对象添加属性(属性值是另外一个类的对象)的方式,可以间接地将两个类关联/整合/组合到一起,从而减少类与类之间代码冗余 3.组合的使用 class OldboyPeople: school = 'oldboy'…
[写在前面] 本帖归属于装饰器单元的学习,可以点击关键词'装饰器'查看其他博文讲解 [正文部分] property属性:将类方法用类属性的形式进行调用 class Good: def __init__(self,name): self.__name = name @property def name(self): # 只能由self参数 return self.__name # 必须要有返回值 @property def setname(self): self.__name = 'Liming'…
@property装饰器 Python内置的@property装饰器可以把类的方法伪装成属性调用的方式.也就是本来是Foo.func()的调用方法,变成Foo.func的方式. class People: def __init__(self, name, age): self.__name = name self.__age = age @property def age(self): return self.__age @age.setter def age(self, age): if is…
'''import导入模块'''import sysprint(sys.path) sys.path.append('D://ASoft/Python/PycharmProjects')import wisirtestwisirtest.wisirtest1()#当用户导入模块时,可能会提示模块找不到,是因为该模块的路径不在sys.path.# 即import在导入模块时,是根据sys.path依次查询要导入的模块.若要导入的模块找不到,可以sys.path.append('\\\')加入要导模…
封装 # class Room:# def __init__(self,name,length,width):# self.__name = name# self.__length = length# self.__width = width# def get_name(self):#C++的编码习惯,一个get和一个set# return self.__name# def set_name(self,newName):# if type(newName) is str and newName.…