面向对象,封装,反射,绑定方法

封装就是对内可访问外部不可访问,不过可以通过给定的接口进行访问

可以通过__语法定义私有属性私有方法  同时可以在父类这样定义使得子类不能继承父类私有属性

def__stu(self)  __n=‘ii‘

内部可以通过设置

def study(self):

self.__stu()

进行访问   同时可以通过 ._类名__属性  的方法进行访问

可以隔离复杂度提高数据安全度

issubclass(,)判断是否是父子关系

将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,

这种特性的使用方式遵循了统一访问的原则

@propertry

def bmi(self):

.bmi就可以调用   并且不能修改该属性也就是该方法,(代码见下)

ps:面向对象的封装有三种方式:
【public】
这种其实就是不封装,是对外公开的
【protected】
这种封装方式对外不公开,但对朋友(friend)或者子类(形象的说法是“儿子”,但我不知道为什么大家 不说“女儿”,就像“parent”本来是“父母”的意思,但中文都是叫“父类”)公开
【private】
这种封装对谁都不公开

python并没有在语法上把它们三个内建到自己的class机制中,在C++里一般会将所有的所有的数据都设置为私有的,然后提供set和get方法(接口)去设置和获取,在python中通过property方法可以实现
ame.setterdef name(self,value):    if not isinstance(value,str):  #在设定值之前进行类型检查        raise TypeError(‘%s must be str‘ %value)    self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAME

@name.deleterdef name(self):    raise TypeError(‘Can not delete‘)

反射 反射即反省 判断并设置里面的属性
class BlackMedium:
    feature=‘Ugly‘
    def __init__(self,name,addr):
        self.name=name
        self.addr=addr

    def sell_house(self):
        print(‘%s 黑中介卖房子啦,傻逼才买呢,但是谁能证明自己不傻逼‘ %self.name)
    def rent_house(self):
        print(‘%s 黑中介租房子啦,傻逼才租呢‘ %self.name)

b1=BlackMedium(‘万成置地‘,‘回龙观天露园‘)

#检测是否含有某属性
print(hasattr(b1,‘name‘))
print(hasattr(b1,‘sell_house‘))

#获取属性
n=getattr(b1,‘name‘)
print(n)
func=getattr(b1,‘rent_house‘)
func()

# getattr(b1,‘aaaaaaaa‘) #报错
print(getattr(b1,‘aaaaaaaa‘,‘不存在啊‘))

#设置属性
setattr(b1,‘sb‘,True)
setattr(b1,‘show_name‘,lambda self:self.name+‘sb‘)
print(b1.__dict__)
print(b1.show_name(b1))

#删除属性
delattr(b1,‘addr‘)
delattr(b1,‘show_name‘)
delattr(b1,‘show_name111‘)#不存在,则报错

print(b1.__dict__)

class BlackMedium:
    feature=‘Ugly‘
    def __init__(self,name,addr):
        self.name=name
        self.addr=addr

    def sell_house(self):
        print(‘%s 黑中介卖房子啦,傻逼才买呢,但是谁能证明自己不傻逼‘ %self.name)
    def rent_house(self):
        print(‘%s 黑中介租房子啦,傻逼才租呢‘ %self.name)

b1=BlackMedium(‘万成置地‘,‘回龙观天露园‘)

#检测是否含有某属性
print(hasattr(b1,‘name‘))
print(hasattr(b1,‘sell_house‘))

#获取属性
n=getattr(b1,‘name‘)
print(n)
func=getattr(b1,‘rent_house‘)
func()

# getattr(b1,‘aaaaaaaa‘) #报错
print(getattr(b1,‘aaaaaaaa‘,‘不存在啊‘))

#设置属性
setattr(b1,‘sb‘,True)
setattr(b1,‘show_name‘,lambda self:self.name+‘sb‘)
print(b1.__dict__)
print(b1.show_name(b1))

#删除属性
delattr(b1,‘addr‘)
delattr(b1,‘show_name‘)
delattr(b1,‘show_name111‘)#不存在,则报错

print(b1.__dict__)


#__setattr__添加/修改属性会触发它的执行
f1=Foo(10)
print(f1.__dict__) # 因为你重写了__setattr__,凡是赋值操作都会触发它的运行,你啥都没写,就是根本没赋值,除非你直接操作属性字典,否则永远无法赋值
f1.z=3
print(f1.__dict__)

#__delattr__删除属性的时候会触发
f1.__dict__[‘a‘]=3#我们可以直接修改属性字典,来完成添加/修改属性的操作
del f1.a
print(f1.__dict__)

#__getattr__只有在使用点调用属性且属性不存在的时候才会触发
f1.xxxxxx

绑定方法在类内部用staticmethod装饰的函数即非绑定方法,就是普通函数

绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入):

    1. 绑定到类的方法:用classmethod装饰器装饰的方法。

                为类量身定制

                类.boud_method(),自动将类当作第一个参数传入

              (其实对象也可调用,但仍将类当作第一个参数传入)

    2. 绑定到对象的方法:没有被任何装饰器装饰的方法。

               为对象量身定制

               对象.boud_method(),自动将对象当作第一个参数传入

             (属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说)

二:非绑定方法:用staticmethod装饰器装饰的方法

        1. 不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。就是一个普通工具而已

    注意:与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值,而staticmethod装饰的方法,不管谁来调用,都没有自动传值一说



原文地址:https://www.cnblogs.com/wrqysrt/p/10463248.html

时间: 2024-08-01 21:50:30

面向对象,封装,反射,绑定方法的相关文章

Python学习——02-Python基础——【8-面向对象的程序设计】——封装、绑定方法与非绑定方

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

面向对象 --- 类的绑定方法,面向对象高阶

昨日回顾 类的绑定方法 classmethod(类的绑定方法) 翻译过来是一个类方法,是一个装饰器,可以装饰给类内部的方法,使该方法绑定给类来使用. --- 对象的绑定方法的特殊之处:由对象来调用,会将对象当作第一个参数传给该方法 --- 类的绑定方法的特殊之处:由类来调用,会将类仿作第一个参数传给该方法 通过对象也可以调用,只是默认传递的第一个参数还是这个对象对应的类 staticmethod(非绑定方法) 是一个装饰器,可以装饰类内部的方法,使该方法即不绑定给对象,也不绑定给类.谁都可以调用

使用java中,面向对象封装+继承的方法算题

1.第一种:给定一行字符,逆序输出此字符串(空格.数字不输出),如"ab 23,(4 cd"输出"dc(,ba".(要求:使用面向对象封装+继承) class Bu { private String str; public Bu(){} public Bu(String str){ this.str = str; } public String getStr(){ return str; } public void setStr(String str){ this.

回归python培训——类与对象、继承、多态和多态性、封装、绑定方法和非绑定方法、反射

一.复习: 1.面向过程:核心是过程,过程就是解决问题的步骤,即先干什么,再干什么,基于面向过程设计程序,就好比在设计一条流水线,就是一种机械思维方法. 优点:复杂的问题简单化 缺点:可扩展性差(牵一发动全身) 应用场景:linux内核,httpd,git 2.面向对象编程:核心是对象,要理解对象应该把自己当成上帝,在上帝眼里一切存在的事物都是对象,不存在也可以创建出来,对象是特征(变量)与技能(函数)的结合 优点:可扩展性强 缺点:无法向面向过程一样准确的知道什么阶段发生什么事,会什么结果 应

Python基础(17)_面向对象程序设计(抽象类、继承原理、封装、多态,绑定方法)

一.抽象类 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化 1.在python中实现抽象类 import abc #利用abc模块实现抽象类 class All_file(metaclass=abc.ABCMeta): all_type='file' @abc.abstractmethod #定义抽象方法,无需实现功能 def read(self): '子类必须定义读功能' pass @abc.abstractmethod #定义抽象方法,无需实现功能 def write(sel

面向对象:多态(多态性)、封装(隐藏属性)、绑定方法与非绑定方法

多态: 多态指的是一类事物有多种形态:比如 动物有多种形态:人.狗.猪 如下代码: import abc class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 @abc.abstractmethod def talk(self): pass class People(Animal): #动物的形态之一:人 def talk(self): print('say hello') class Dog(Animal): #动物的形态之二:狗 def talk(se

第七课:类、抽象类、绑定方法、反射

上节回顾 面向过程与面向对象 面向过程:核心的就是过程,过程就是解决问题的步骤,就是实现确定先干什么后干什么,面向对象的设计程序就好比是在设计一条流水,是一种机械思维方式. 优点:复杂的问题简单化 缺点:可扩展性差(牵一发而动全身) 用到的一些经典案例:Linux内核,httpd,git 面向对象:核心是对象,要理解对象应该把自己当成上帝.把一切存在的事物都当成对象,不存在的也可以创建出来.对象可以理解为特征(变量)与技能(函数)的结合体. 优点就是可扩展性强. 缺点是无法像面向过程一样准确的知

面向对象,绑定方法与异常处理(七)

1.1 继承与派生 1.1.1 什么是继承     是一种新建类的方式,新建的类称为子类,子类会遗传父类的属性,可以减少代码冗余     在python中,子类(派生类)可以继承一个或者多个父类(基类,超类)   python中类的继承分为:单继承和多继承 class Parent1: #定义父类 pass class Parent2(object): #定义父类 pass class Sub1(Parent1): ##单继承,基类是Parent1,派生类是Sub1 pass class Sub

面向对象二次整理(基础,属性引用,方法引用.绑定方法)

概念之类的去百度一下... 基础 类 属性 实例变量 类变量(默认共享) 私有属性(__var) 方法 构造方法 析构方法或析构函数 私有方法 对象: 实例化一个类之后得到的对象 封装 把一些功能的实现细节不对外暴露 类的初始化(__init__): 就是给对象定义一些自己的特征,不能有返回值 继承 代码的重用 单继承 多继承 2.7的经典类-->深度优先,新式类-->广度优先 3.x 均是广度优先 class Foo() 多态 接口重用,一种接口,多种实现 高级属性: 静态方法 与类无关,不