面对对象进阶2

面对对象进阶2

类的封装

封装:隐藏属性或方法,外部无法使用,内部可以使用,再类定义阶段就执行了,真的想引用,就使__类名__属性名

隐藏模块内部的函数/变量_x:from module import *(无法导入),from module import _x(不合理)

@property:被 @property 装饰的函数会从函数变成属性,也就是说直接.函数名,不需要加括号使用

class People:
    def __init__(self,pwd):
        self.__pwd = pwd

    @property       #被property 装饰的函数会从函数变成属性
    def pwd(self):
        return f'无法获取你的密码'

p = People('123')
print(p.pwd)       #无法获取你的密码 

对属性这个封装有什么用:藏起来,保护了你的隐私,类内部的属性不想让其他人访问,

class F1:        # F1类名
    __count = 0  # __count属性名

f= F1()
print(f._F1__count)  #如果真的要拿,_类名__属性去拿(不可能这样做)

#0  

对方法封装有什么好处:精简了代码,你吃饭就使用chifan这个方法就行了,不需要去关心其他的操作,并且外部调用者也不知道你内部发生了什么

class Foo:
    def f1(self):
        print('FOO.f1')
    def f2(self):
        print('Foo.f2')
        self.f1()

class Bar(Foo):
    def f1(self):
        print('Bar.f1')

foo = Bar()
foo.f2()       #先从Bar对象中寻找f2,再从Bar类中寻找f2,再从Bar的父类中的对象进行查找f2,找到了,再从Bar对象中寻找f1,找到了

Foo.f2
Bar.f1
class Foo:

    def __f1(self):
        print('FOO.f1')

    def f2(self):
        print('Foo.f2')
        self.__f1()

print(Foo.__dict__)        #类中所有的方法和属性,使用时点出来

class Bar(Foo):
    def __f1(self):
        print('Bar.f1')

bar = Bar()  #执行Bar类,Bar类继承了Foo父类,可以使用父类中的所有方法
bar.f2()    #使用父类中f2的函数,由于__f1()函数,在定义阶段,就已经被封装了,会把私有属性__f1变成__Foo__f1,之后都不会做这种处理

{'__module__': '__main__', '_Foo__f1': <function Foo.__f1 at 0x00D538A0>, 'f2': <function Foo.f2 at 0x00D53C90>, '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None}
Foo.f2
FOO.f1
class Foo():
    __count = 0   #类的内部

foo = Foo()
print(foo)

foo.__y = 1    #类的外部
print(foo.__y)

<__main__.Foo object at 0x00B96B90>
1

类的property特性

@property:会让函数方法bmi()变成属性,我们就应该用@property。

@方法名.setter:被@方法名.setter装饰的函数,让这个函数方法bmi()可以进行属性一样的修改,所以@bmi.setter装饰器的函数方法必须是property装饰的函数方法名bmi(),而不可以是随意定义的函数名字,如果换成其他名字会报错,显示的就是该属性(实际是个函数)无法进行修改或删除

随意定义函数方法名是类属性方法使用property可以使用的

@方法名.deleter:被@方法名.deleter装饰的函数,方法名删除,会执行这个装饰的函数,

class People():

    def __init__(self,height,weight):
        self.height = height
        self.weight = weight

    @property       #获取值的时候触发,你不需要加括号使用,不能加参数
    def bmi(self):
        return self.weight/(self.height**2)

    @bmi.setter    #修改bmi的时候触发,函数里面必须得加参数
    def bmi(self,value):
        print(f'你已经成功修改为{value}')

    @bmi.deleter   #在删除bmi的时候触发,函数里面不能加参数
    def bmi(self):
        print('delter')

peo = People(1.8,70)
print(peo.bmi)

print('*'*50)
peo.bmi = 50

print('*'*50)
del peo.bmi

21.604938271604937
**************************************************
你已经成功修改为50
**************************************************
delter

类与对象的绑定方法和非绑定方法

什么时候使用?

需要使用类做为参数的时候就得使用类绑定方法@classmethod

需要使用对象作为参数的时候就得使用对象绑定方法

既不需要类作为参数又不需要对象作为参数,使用费非绑定方法,@staticmethod

@classmethod让被装饰的函数给类使用,约定俗成参数为cls

绑定类的方法,类能使用,对象也可以使用,但是参数依然是类

@staticmethod什么都不绑定,非绑定方法,定义了普通的函数

class Foo:
    #绑定给对象,只有对象能用,但是类也能使用,使用的时候必须得传参
def f1(self):
    print(self)
@classmethod  #让被装饰的函数给类使用,约定俗成参数为cls
              #绑定给类的方法,类能使用,对象也可以使用,但是参数依然是类
@staticmethod  #什么都不绑定,非绑定方法,定义了普通的函数
class Foo:
    # 绑定给对象,只有对象能用,但是类也能使用,使用的时候必须得传参
    def f1(self):
        print(self)

    @classmethod  #让被装饰的对象给类使用,约定俗成参数为cls
    def f2(cls):
        print(cls)

    # 什么都不绑定,非绑定方法,定义了普通的函数
    @staticmethod
    def f3(self):
        print(self)

f = Foo()  # 实例化对象
f.f1()        #绑定给对象,对象使用功能
Foo.f1(1111)  #类中使用对象的功能,需要添加参数,打印传参的值

print('*'*50)
Foo.f2()     #类中使用对象的功能,
f.f2()       #没有传参数,打印类的名字

print('*'*50)
Foo.f3(2222) #传参的值,就是打印的值
f.f3(2222)  # 运行类中的函数,打印结果

<__main__.Foo object at 0x00B56BB0>
1111
**************************************************
<class '__main__.Foo'>
<class '__main__.Foo'>
**************************************************
2222
2222

python2中类属性调用的方法

对象的绑定方法:没有加任何装饰的方法就是对象的绑定方法

类的绑定方法:加了@classmethod装饰器的方法就是类的绑定方法

非绑定方法:加了staticmethod装饰器的方法就是非绑定方法,其实就是一个普通的函数

原文地址:https://www.cnblogs.com/zuihoudebieli/p/11219187.html

时间: 2024-11-11 08:31:41

面对对象进阶2的相关文章

35.python全栈之路:面对对象进阶

面对对象进阶 1.多继承中的self class A: def bar(self): print('BAR') self.f1() ''' self本身代表的D类的对象d1 d1如果要在他的父类中去寻找f1 首先应该去C类 ''' class B(A): def f1(self): print('B') class C: def f1(self): print('C') class D(C, B): pass d1 = D() d1.bar() 流程分析: d1 = D(),最终找到了objec

面对对象进阶

面对对象进阶 类的继承 python当中,父类和子类(派生类),父类和子类只有在继承的时候才会产生 继承是为了拿到父类的所有东西 class Parent_Foo: #父类 def __init__(self, first_name, money, car, house): self.first_name = first_name self.money = money * 0.5 print('继承财产扣掉一半') self.car = car self.house = house def fi

学习Python基础--------6面对对象进阶

上节回顾 类 属性 实例变量(存在每个实例的内存里) 类变量(存在类里,共享使用) 私有属性__var 方法 构造方法 __init__ 析构方法 __del__ (实例打开链接临时文件关闭后销毁) 私有方法 对象:实例化一个类之后得到的对象 封装 把一些功能的实现细节不对外暴露 续承 继承方式 继承 组合 代码的重用 单级成 多继承 2.7 广度优先新式类,深度优先经典类 3.0 都是广度优先 class Foo(School) def __init__(self,name,age,sex,s

跟着百度学PHP[4]OOP面对对象编程-7-OOP的一些关键子讲解

面对对象常用的一些关键子:http://www.cnblogs.com/xishaonian/p/6146794.html排版不是很好望见谅. THE END 跟着百度学PHP[4]OOP面对对象编程-7-OOP的一些关键子讲解

跟着百度学PHP[4]OOP面对对象编程-5-内部引用$this

$this就是对象内部代表这个对象的引用 可以调用被封装的方法或者属性! <?php class Person{ private $name; private $age="21"; var $sex; function play(){ echo "他正在玩儿呢"; } private function Hello(){ //使用private封装hello方法.该方法不可直接调用.但是可以在内部使用$this调用. echo "这个是被封装的内容&q

面对对象_面向对象的概念、类与对象的关系

面向对象的基本概念: 1.什么是面向对象 1.面向对象是一种编程思想 2.面向对象是一种思考问题的思维方式 2.建立面向对象的思维方式 1.先整体,再局部 2.先抽象,在具体 3.能做什么,再怎么做 3.如何学习面向对象 1.掌握一门面向对象语言的语法 2.熟悉面向对象的设计原则 3.熟悉面向对象的设计模式 面对对象的概述:   1.面对对象的三个特征(公认的):封装,继承,多态.(也可以说是四大特征:封装,继承,多态,抽象)   2.开发中先找对象,没有就建立一个对象,实际就是找对象,建立对象

js面对对象编程

说到js,很大一部分人会说我很熟悉,在日常的web开发中经常用,那么你的js代码是符合面对对象思路的吗?那你会问我面向过程的js代码有什么不好吗?我的感受是面对对象的js编码更加简洁,减少了混乱,可维护行增强,适合编写富客户端时应用. 好了,首先看看js里如何定义对象: <html> <head> <script type="text/javascript"> var obj=new Object(); obj.name='josh'; obj.ag

Day-8: 面对对象编程

面对过程的程序设计方法意在将函数分成子函数,再依次调用这些函数来解决问题. 而面对对象的程序设计方法,来源于自然界,类是实例的抽象,实例是类的具体.自定义出来的对象是类,而所有的数据都可以看成是对象,因此解决问题的方法是靠对象自己处理消息和相互传递消息.使用时,首先考虑的是需要创建什么样的对象,对象中有怎么样的属性,要实现什么功能(成为方法). 面向对象的抽象程度比函数要高,因为一个class中既包含数据,又包含操作数据的方法.其中,数据封装.继承和多态是面向对象的三大特点. 创建类时,clas

Java入门——(2)面对对象(上)

关键词:面对对象.类..构造方法.this.static.内部类 一.面对对象的概念:把解决的问题安装一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题.其特点可概括为封装性.继承性.多态性. 1.封装性:面对对象的核心,将对象的属性和行为封装起来,不需要让外界知道具体实现细节,这就是封装思想. 2.继承性:主要描述的是类与类之间的关系,通过继承,可以在无需重新编写原有类的情况下,对原有类的功能进行扩展. 3.多态性:是在程序中允许出现重名现象,它指在一个类中定义的属性和方法被其他类