博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面向对象 之 类
阅读量:5330 次
发布时间:2019-06-14

本文共 6120 字,大约阅读时间需要 20 分钟。

一 类的成员

  首先什么是类的成员,很简单,你能在类中写什么?写的内容就是成员.

class Foo:   # 类名    # 方法    def __init__(self,参数1,参数2):        # 属性变量        self.属性1 = 参数1        self.属性2 = 参数2        # 方法    def methond(self):        pass

  在上面的 代码中 __init__ 和 methond 都属于类的成员方法,又称为实例方法,总之这样的东西需要

      用对象来访问,而上面的  self.属性1 = 参数1 这个代码的含义是给对象设置属性信息,含义

      是这个对象的 xxx 属性是 xxx,这种东西又被称为 成员变量 或者 实例变量,再或者称为

      字段,都是一个意思

  也就是说,类中,是存在 实例变量 和实例方法 的,还有什么呢??我们来一个个的看

二 类的成员 ------- 变量

  在类中 变量分为两大类:

    1.实例变量(字段)

    2.类变量(静态变量)

  实例变量,就是每个实例都应该拥有的变量,比如,人的名字,人的爱好,每个人的个人信息,

      都属于实例变量.

  类变量: 就是这一类事物统一拥有的变量,比如,在座的各位都是中国人,那大家都拥有同一个国家

class Person:    # 类变量,表示所有的该类的对象都共享这个变量    country = "中国"    def __init__(self,name,age,birthday):        # 实例变量(字段)表示你创建的每一个人都有这三个变量        self.name = name        self.num = age        self.birthday = birthdayp1 = Person("哈哈哥",18,"2000年01月01日")print(p1.name)      #  哈哈哥print(p1.country)   #  中国p2 = Person("嘻嘻姐",16,"2001年05月05日")print(p2.name)      # 嘻嘻姐print(p2.country)   #  中国

  我们发现对象 p1 和 p2 的 name 都是对象自己 的,但是 country 是类的,大家共有同一个变量

  来我们验证一下啊......

class Person:    # 类变量,表示所有的该类的对象都共享这个变量    country = "中国"    def __init__(self,name,age,birthday):        # 实例变量(字段)表示你创建的每一个人都有这三个变量        self.name = name        self.num = age        self.birthday = birthdayPerson.country = "中华人民共和国"p1 = Person("哈哈哥",18,"2000年01月01日")print(p1.name)      #  哈哈哥print(p1.country)   #  中华人民共和国p2 = Person("嘻嘻姐",16,"2001年05月05日")print(p2.name)      # 嘻嘻姐print(p2.country)   #  中华人民共和国

 

     发现了吧,我把类 变量中的值改了,大家看到的都跟着变了,为什么呢?我们要从内存来分析

  通过图 我们发现,实例变量中都 隐含着一个创建这个对象的类,通过这个类 能找到我们类中定义的

全部内容,包括 方法 和 属性的 信息等

  接下来,我们看一个 和类变量 息息相关的坑

 

class Person:    # 类变量,表示所有的该类的对象都共享这个变量    country = "中国"    def __init__(self,name,age,birthday):        # 实例变量(字段)表示你创建的每一个人都有这三个变量        self.name = name        self.num = age        self.birthday = birthdayp1 = Person("哈哈哥",18,"2000年01月01日")p1.country = "中华人民共和国"print(p1.name)      #  哈哈哥print(p1.country)   #  中华人民共和国p2 = Person("嘻嘻姐",16,"2001年05月05日")print(p2.name)      # 嘻嘻姐print(p2.country)   #  中国

 

  上面是  中华人民共和国,下面是 中国,为什么会这样呢? 注意: 在执行 p1.country= "中华人民共和国" 的 时候,其实并没有 去改变类中的 country ,而是给对象 添加了一个 实例变量,并且这个 实例 变量,只有当前 p1是 存在的 ,在 p2 中是不存在的

  在图中,我们能清晰的看到,我们其实并没有改变类变量,只是 p1 中添加了一个实例变量,仅此而已

通过这里,我们应该能发现,类变量,最好是用类名来访问,当然,我们通过对象名也可以访问,但只能看,

不能改变,象牙哦改变,需要用类名来改变

class Foo:    count = 0    def __init__(self):        Foo.count += 1print(Foo.count)        # 0Foo()Foo()Foo()print(Foo.count)        # 3# 通过程序来记录当前类被创建了多少个对象

 

  总结:

    实例变量:给对象用的

    类变量:多个对象共享的,最好是用类名来访问,这样更加规范

二 类的成员 方法

  1.成员方法(实例方法)

  2.静态方法

  3.类方法

 1 .先说第一个 成员方法,我们用的最多的就是这个,对象直接访问的方法叫成员方法

class Computer:    # 实例方法(成员方法)    def play(self):        print("我的电脑可以玩")c = Computer()c.play()        # 对象直接去调 实例方法# 我的电脑可以玩

 

  2.静态方法,静态方法不需要我们给方法船度 self,也就是说,当出现一个方法不需要使用到成员

        变量的时候,就可以选择使用静态方法,静态方法需要我们再上面添加一个

        @staticmethond

 

class Computer:    # 实例方法(成员方法)    def play(self):        print("我的电脑可以玩")    @staticmethod    def fare():        print("我的电脑非常牛,会游泳...哈哈哈")c = Computer()c.play()        # 对象直接去调 实例方法# 我的电脑可以玩# 静态方法 和 静态变量一样,一般都是用类名直接访问 和 调用的Computer.fare()   # 类名可以直接访问的c.fare()          # 对象也可以访问,但最好别这么干,以区分静态方法 和 实例 方法# 我的电脑非常牛,会游泳...哈哈哈# 我的电脑非常牛,会游泳...哈哈哈

  类方法,类方法 和 静态方法差不多,只不过类方法需要在 参数列表中的第一个位置预留一个位置

      通常我们给第一个位置参数起名字叫 cls,类方法在被调用的时候,也不需要传递实例对象

      但是,系统会自动的 把类传递给第一个参数,类方法在编写的时候,需要在类方法上面

      添加  @classmethod

class Computer:    def play(self):        print("我的电脑可以玩")    @staticmethod    def fare():        print("我的电脑非常牛,会跑....")    @classmethod    def cal(cls,a,b):        print(cls)          # 
return a+bprint(Computer.cal(1,2)) # 3

 

    想一下啊, 类方法/静态方法 和 实例方法 有什么区别???

三 类的成员 ---属性

    属性其实就是通过方法改造过来的一种变量的写法,在方法上添加一个 @property 就可以了

class Person:    def __init__(self):        pass    @property    def age(self):        return 1p = Person()age = p.ageprint(age)

 

  应用场景:我们一般保存数据的时候,不会保存一个人的年龄,因为随着时间的推移,每个人的年龄都时刻在改变着,那如何保存更加完美呢?很简单,保存出生年月日,然后用程序来计算,你当前的年龄,实时的,那这个时候就需要进行 相应的计算了,而计算属于一个功能,当然要写方法里,但是对于年龄这个属性而言,他应该是一个数值,而不是一个动作,所以 python 就提供了这样一种机制,通过方法来描述一个属性

  注意:

    1.方法参数只能有一个 self

    2.方法上方要写 @property

    3.调用的时候,我们不需要写括号,直接当成属性变量来用就可以了

    4.这种套路只能取值,不能设置值

四 私有

  在python 中 一般是不提倡设置和 使用私有信息的,但有些场景,我们不得不这么做,比如在一个公司,

每个人的收入情况,这种内容绝对是不能公开的

  在 python 中,使用 __ 作为方法或者变量的前缀,那么这个方法或者变量就是一盒私有的

 1.私有变量

class Person:    def __init__(self,laopo,mimi):        self.__laopo = laopo      # 私有        self.__mimi = mimip = Person("哈哈","呵呵")  # 报错,对象没有__mimi 这个属性 ,为什呢??print(p.__mimi)# AttributeError: 'Person' object has no attribute '__mimi'

 

 

程序报错,私有内容是访问不到的,但是,这个访问不到试油局限性的,比如

class Person:    def __init__(self,laopo,mimi):        self.__laopo = laopo      # 私有        self.__mimi = mimi    def gaosu(self):        print("大喇叭广播了,大家都知道了")        return self.__mimi    # 私有的内容,在他 自己哪里,可以任意的进行使用p = Person("哈哈","我是个惊天大秘密")mimi = p.gaosu()    # 通过一个私有的方法,访问到了他的秘密print(mimi)# 大喇叭广播了,大家都知道了# 我是个惊天大秘密

 

  记住,私有的内容不能直接访问,但是如果对方开辟了外界访问的通道(公共方法)那可以通过这个公共

的方法来获取到私有的内容,这样的好处是,外界,只能看,但是改不了,不单单实例变量有私有的,类变量

,静态变量 一样拥有这样的属性

class Person:    def __init__(self,laopo,mimi):        self.__laopo = laopo      # 私有        self.__mimi = mimi    def gaosu(self):        print("大喇叭广播了,大家都知道了")        return self.__mimi    # 私有的内容,在他 自己哪里,可以任意的进行使用p = Person("哈哈","我是个惊天大秘密")mimi = p.gaosu()    # 通过一个私有的方法,访问到了他的秘密print(mimi)print(Person.__zisi)  # 还是报错,没有这个 变量# AttributeError: type object 'Person' has no attribute '__zisi'

 

2.私有方法

  私有方法,顾名思义,只能自己访问的方法,别人都不能随便调用的

class Person:    def __init__(self):        pass    def __yue(self):        print("我要约会!!!")    def job(self):        print("我要工作!!!")p = Person()# p.__yue()      #  会报错的   类中没有这个方法,为什么呢??明明有的嘛p.job() # 因为 __yue 是一个 私有方法,只能在类中自己调用,类外面不能访问 # 然而 job 是yield成员方法,并且是一个开放的方法,在类外界可以被访问到

 

  同样的,类中的私有方法也是相对而言的 ,我们可以通过其他方法来访问到这样的方法

class Person:    def __init__(self):        pass    def __yue(self):        print("我要约会!!!")    def job(self):        print("我要工作!!!")        self.__yue()        #在自己类中访问自己的其他方法,哪怕私有的,也是自己在调用p = Person()p.job()

 

    关于类方法和静态方法 和 成员方法一样,就不再赘述了

  需要注意的是,对于私有的内容而言,子类是无法继承的

class Fu:    __qingfu = "情妇"class Zi(Fu):    passprint(Zi.__qinfu)  # 报错

 

转载于:https://www.cnblogs.com/wenqi2121/p/10316539.html

你可能感兴趣的文章
【题解】 bzoj1597: [Usaco2008 Mar]土地购买 (动态规划+斜率优化)
查看>>
css文本溢出显示省略号
查看>>
git安装和简单配置
查看>>
fat32转ntfs ,Win7系统提示对于目标文件系统文件过大解决教程
查看>>
Awesome Adb——一份超全超详细的 ADB 用法大全
查看>>
shell cat 合并文件,合并数据库sql文件
查看>>
Android 将drawable下的图片转换成bitmap、Drawable
查看>>
介绍Win7 win8 上Java环境的配置
查看>>
Linux设置环境变量的方法
查看>>
构建自己的项目管理方案
查看>>
利用pca分析fmri的生理噪声
查看>>
div水平居中且垂直居中
查看>>
epoll使用具体解释(精髓)
查看>>
AndroidArchitecture
查看>>
安装Endnote X6,但Word插件显示的总是Endnote Web"解决办法
查看>>
python全栈 计算机硬件管理 —— 硬件
查看>>
大数据学习
查看>>
简单工厂模式
查看>>
Delphi7编译的程序自动中Win32.Induc.a病毒的解决办法
查看>>
Objective-C 【关于导入类(@class 和 #import的区别)】
查看>>