一、对象的特有名称空间

# 对象独有的名称空间:在产生对象时就赋初值

'''
class ted:
def func(): 当func里不存在参数时,调用时不需要给值
print('hah')
ted.func()
'''
'''
class ted:
def func(self):
print('hah')
ted.func('useless')
'''
#类里面的方法属于谁的名称空间,就被谁调用
#类里面的方法的名称空间不属于对象,怎么实现调用这些方法
#方法如下:
#1
class student:
def set_stu(stu,name,sex):
stu.name=name
stu.sex=sex
stu1=student()
#将对象stu1作为参数传递到方法里去 此时将对象的名称空间里放入我们想要的值,也就是赋值
student.set_stu(stu1,'bob','male')
print(stu1.__dict__) #{'name': 'bob', 'sex': 'male'}
print(stu1.name) #bob
print(stu1.sex) #bob #2
#将产生的对象的空的名称空间与名称空间赋值操作整合
class students: #__init__会在实例化对象时被调用
#1.会为实例化的对象形成空的名称空间
#2.就是一个方法,可以被传参,在类名(实参)这种方式下调用并传参 __init__(self,形参)
#第一个self就是要产生的当前对象
#在方法内部,形参拿到了实参值,使用self.属性名=形参 本质上=实参,为对象的名称空间添加属性!
def __init__(self,name,sex):
print('1<<<',self)
self.name=name
self.sex=sex #建议新增的参数与属性名(变量名)命名保持一致
return None #默认值返回为None
stu2=students('tom','female')
print(stu2.name,stu2.sex) #tom female 二、类中方法的第一个默认参数:对象方法
class student:
pass
text=student() def func():
print('我又来了!')
student.func=func #在类的字典中添加func这个key,value为对应的函数func的地址,即为类添加东西
# print(student.__dict__) class student1:
pass
text1=student1()
def func1(a): #此处需要一个参数a,用来接受text1自身
print('你咋又来了?')
student1.func1=func1
text1.func1() #==student1.__dict__['func1](text1)
# 给类添加一个函数,通过对象去调用这个函数,本质上等价于在这个函数中传入一个参数text1
#对象使用类的函数,本质上还是通过类去获取对应的关系,将对象传进去 #总结:所有的函数的第一个参数都是通过类调用函数传进去来调用对象
text1.func1()==student1.__dict__['func1'](text1)==student1.func1(text1) # 对象调用方法的第一个参数一定是调用该方法的参数!

三、类方法
#类方法
#下面所有为自己推导的,先自己了解一下相关流程,系统有更好的方法,在后面介绍
class tool:
#类自己的方法
def add(n1,n2):
return n1+n2
res=tool.add(10,20) #类使用自己的方法时,存在几个参数就传入几个
print(res) #30
text=tool()
#print(text.add(10,20)) 这样输出,会出错,原因是加上自身,我们给了3个实参,而方法只接受了2个参数
#接受的第一个参数是其本身(text),第二个是给的参数10,第三个未被接收
#小点:类的名字,对象都可以使用,但是出现了类与对象使用方法时,传入的参数有差异!
#解决的方案 语法糖
class took:
def acd(cls,n1,n2):
cls.fn()
return n1+n2 def fn(): #里面不给参数时,类调用时不需要给实参,对象调用时需要给定一个实参,可以为self,也可以为其它
print('小样,咋又来了?') #如果方法a被对象took调用,那么也会在内部调用b, b间接被外界对象took调用
def a(self):
self.b()
def b(self):
pass text1=took()
res=took.acd(took,10,20)
# print(text1.acd(10,20)) #此时会出错,在调用方法fn时,缺少自身的一个参数 #系统的方法 @classmethod 装饰器
class Tool:
#类方法:可以被类与对象调用的方法,第一个参数一定是类
#类方法不建议拿对象来调用
@classmethod
def add(cls,n1,n2):
print(id(cls)) #两个地址是一样的,还是证明了对象是通过类去调用方法的!因此不建议用对象此时来调用方法
return n1+n2
print(Tool.add(12000,18000)) #此时传入的第一个参数是类本身
tool=Tool()
print(tool.add(13,15)) #对象调用类方法,此时传入方法的第一个参数不是对象,而是 tool.__class__

·

四、属性与方法的总结

#属性与方法的总结(类最好使用类方法,对象最好使用对象方法)

class china:
#属于类的属性
name='wuchanghu' #属于对象的属性
def __init__(self,name):
self.name=name
#属于类的方法,获取名字
@classmethod
def get_name(cls):
return cls.name #属于对象的方法,获取名字
def get_names(self):
return self.name city=china('anqing')
country=china('wangjiang') #产生两个对象 #类方法的使用
print(china.get_name()) #类调用自己的方法 print(city.get_name()) #对象来调用
print(country.get_name())
#总结:类方法拿对象调用并没有多少意义,不建议拿对象来调用 #对象方法的使用
print(china.get_names(city))
print(china.get_names(country)) #类来调用对象的方法 print(city.get_names())
print(country.get_names())#对象来调用对象方法,本质上还是通过类去调用

五、封装

class func:

    def get_box(self):
print('找到保险箱') def get_money(self):
print('取出12000')
fn=func()
fn.get_box()
fn.get_money() #在类外面可以取到里面的值
#需求:将类中的一些功能与属性进行隐藏,不让外界总结访问(可以间接访问)
#措施: 在属性前面加上__,此时在外界不能通过__属性取出
#下面是类的封装
class func:
__name='jun' #也可对类的属性进行隐藏
@classmethod
def __get_box(cls):
print('输入密码,找到保险箱')
cls.__get_money() #在内部可以通过__get_box()来访问另外的属性
@classmethod
def __get_money(cls):
#可以在此添加具体数据与功能来做安全操作
print('取出12000')
fn=func()
fn._func__get_box() #输入密码,找到保险箱 \n 取出12000
print(fn._func__name)
#虽然说此时进行了封装,然而对熟知python规则的人来说,真的是一个鸡肋 #下面是类的属性的封装
class f1:
def __init__(self,money):
self.__money=money
def __text(self):
print('run away')
a=f1(8888) #值可以正常传入
a._f1__text()
print(a._f1__money) #取出需要通过_f1__money来做到 #下面是对象的属性的获取
class dx:
def __init__(self):
print('hah')
self.money=200
# return self.money return 的返回值应该为None
def fun1(self,money):
self.money=money
return self.money d=dx()
print(d.money) #200
print(d.fun1(100)) #100
print(d.money) #100 self.money对于对象自己来说就是一个变量而已,只是在用他的变量名,值可以改变 #对象的封装
#对象方法的封装
class dx:
def __init__(self):
print('hah')
self.__money=200 def __fun1(self,money):
self.money=money
return self.money
x=dx()
print(x._dx__money) #200
print(x._dx__fun1(333)) #300
print(x._dx__money) #200 因为fun1里面的money与__money不是同一个变量 #对象属性的封装
class dx:
def __init__(self):
print('hah')
self.__money=200
def __fun1(self,money):
self.__money=money
return self.__money
x=dx()
# print(x.money) #此时通过这种途径找不到
print(x._dx__money) #200
print(x._dx__fun1(333)) #333
print(x._dx__money) #333 同一个变量名,值一改变,就都变了 封装的另外一种取值方法: 对象的属性:封装的目的
1.对象的属性值一般来源于外界,外界是有权利再次访问的
2.封装的目的不是让外界无法访问,而是不让其直接访问,可以在完成安全处理后再访问
class dx:
def __init__(self):
print('haha')
self.__money=200
@property #取值 #加上@property a.money代表使用该方法,而不再是找这个money函数的函数名
def money(self):
print('走方法拿到的money') #走方法拿到的money \n 200
return self.__money # #赋值
@money.setter #加上了@money.setter,实际上是调用了该方法,并给其传值 a.money=1111 == a.money(1111)
def money(self,money):
self.__money=money
print('我有没有走')
return self.__money
#删除
@money.deleter #加上这个装饰器,外界的删除,会调用该方法,在其内部在做相应处理
def money(self):
print('逗你玩')
# del self.__money #在类内部可以访问到其他方法,注释该功能后,系统并没有删除掉该属性
a=dx()
print(a.money) #走方法拿到的money 返回self.__money=200
a.money=111 #我有没有走 返回赋值后的money=111
print(a.money) #走方法拿到的money 返回已经赋值后的self.__money=111 del a.money #在类外面,此时的del a.money 并不是直接删除,而是通过调用 删除方法 完成相对应的功能
print(a.money) #走方法拿到的money 属性money并没有删除 #总结:约定俗成,对一种属性提高对外的接口时,也就是加上了这几个装饰器,那这些属性对应的方法名必须是一样的!
# 同时,@property必须在上面,其他随意,因此存在一定的顺序
												

day 23 对象的名称空间 类,对象属性和方法 封装 接口提供的更多相关文章

  1. python基础——类名称空间与对象(实例)名称空间

    python基础--类名称空间与对象(实例)名称空间 1 类名称空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类的良好总属性:数据属性和函数属性 其中类 ...

  2. python基础之类和对象、对象之间的交互、类名称空间与对象/实例名称空间

    一 面向对象初识 Python要么是面向过程要么是面向对象. 概念及优缺点: 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东 ...

  3. Python 入门基础10 --函数基础3 函数对象、名称空间、装饰器

    今日内容 1.函数对象 2.名称空间与作用域 3.函数的嵌套调用与闭包 4.装饰器 一.函数对象 1.1 定义 函数名存放的就是函数地址,所以函数名也就是对象,称之为函数对象 1.2 函数对象的应用 ...

  4. JAVA之旅(十二)——Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口

    JAVA之旅(十二)--Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口 开始挑战一些难度了,线程和I/O方面的操作了,继续坚持 一. ...

  5. java 编程基础 Class对象 反射 :获取类的构造方法,方法,成员变量,内部类,外部类,父类,实现的接口,修饰符等...

    类 Class  每个类被加载之后,系统就会为该类生成一个对应的Class对象,通过该Class对象就可以访问到JVM中的这个类. 我们在Java中获取Class对象一般有三种方式: (1), 使用C ...

  6. java基础学习总结六(对象与类、类的属性与方法)

    一:面向过程与面向对象的区别 举例:一个人开门的动作,可以分解为开门,人进去,关门. 面向过程:人作为执行者,1:开门  2:进入   3:关门 面向对象:人作为指挥者,将开门,关门的动作都封装到门上 ...

  7. <九>面向对象分析之UML核心元素之设计类,类,属性,方法,可见性

    设计类

  8. final可以修饰类、属性、方法

    final可以修饰类.属性.方法. 当用final修饰类的时候,此类不可被继承,即final类没有子类.这样可以用final保证用户调用时动作的一致性,可以防止子类覆盖情况的发生. 当利用final修 ...

  9. Java反射学习-1 - 反射获取类的属性,方法,构造器

    新建一个Person类 package cn.tx.reflect; /** * 注解初步了解 * @author Administrator * */ public class Person { p ...

随机推荐

  1. NodeJS基础总结(一)

    NodeJS官网网址:https://nodejs.org/en/ 使用require方法加载fs核心模块 var fs = require('fs'); 一.读取文件//   第一个参数就是尧读取的 ...

  2. 多组图自动无限循环(swiper轮播)

    前两天的一个项目中遇到多组图片无限轮播,当时采用了swiper 但是没有解决让它无限轮播.今天再次尝试了一下发现是自己的样式写错了.今天在这里写一下,为了给自己一个警醒不要犯同样的错误 首先先引入一下 ...

  3. python-文件读写

    python对文件的操作对文件操作的步骤:1.打开文件2.读写文件3.关闭文件 一.读取文件的方法有三种:read(),readline(),readlines()f.readline() #每次读出 ...

  4. ubuntu 安装nginx, 出现 Unable to locate package

    今天在初始化一台新的ubuntu 服务器时,敲上了 sudo apt-get install nginx 来安装nginx, 却发现提示:  Reading package lists... Done ...

  5. [luogu P2391] 白雪皑皑

    [luogu P2391] 白雪皑皑 题目背景 “柴门闻犬吠,风雪夜归人”,冬天,不期而至.千里冰封,万里雪飘.空中刮起了鸭毛大雪.雪花纷纷,降落人间. 美能量星球(pty 在 spore 上的一个殖 ...

  6. js设置radio单选框值选中

    html页面: <div> <label><input type="radio" name="sex" value="m ...

  7. java AQS 一:

    最近加班太多,很久没有更新博客了,周末看了下阿里大神并发的书籍,把知识点做个记录. 一:线程安全的定义 当多个线程并发访问某个类时,如果不用考虑运营环境下的调度和交替运行,且不需要额外的辅助,这里认为 ...

  8. js定义函数方式有。。。

    1,常见方式 function  fun(data,...){ console.log(data); } 注:随处可调用 2. 函数直接定义函数 var fun = function (data,.. ...

  9. secureCRT保存屏幕输出内容

    1.有时执行一个mysql语句,屏幕打印行过多,需要设置翻动最大行数 打开Options Session Options–>Terminal–>Emulation,在Scrollback输 ...

  10. ubuntu安装smartGit

    1.首先安装jdk:(http://www.cnblogs.com/xiaochou/p/install_mint.html 评论区) 2.下载和安装smartGit: http://www.synt ...