zoukankan      html  css  js  c++  java
  • python之路--面向对象-成员

    一 . 成员

      在类中你能写的所有内容都是类的成员

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

      在上⾯代码中__init__和method都属于类的成员⽅法. ⼜称为实例⽅法. 总之这样的东⻄
        需要⽤对象来访问. ⽽上⽅的self.属性1 = 参数1 这个代码的含义是给对象设置属性信息. 含
          义是这个对象的xxx属性是xxxx. 这种东⻄⼜被称之为成员变量或者实例变量, 再或者被称之
            为字段. 都是⼀个意思.

    二 . 变量

      1. 实例变量(字段): 昨天写的就是实例变量, 由对象去访问的变量.
      2. 类变量.(静态变量) 此时. 这个变量属于类. 但是对象也可以访问.

      

    先说什么是实例变量. 说⽩了. 就是每个实例都应该拥有的变量. 比如. ⼈的名字, ⼈的爱好,
    每个⼈的个⼈信息. 都属于实例变量. 那什么是类变量. 就是这⼀类事物统⼀拥有的变量. 比如. 在座的各位都是中国⼈. 那⼤家都拥有同⼀个国家.

       例:

    class Person:
        # 类变量, 表示所有的该类的对象都共享这个变量.
        country = "中国"
        def __init__(self, name, num, birthday):
    
            # 实例变量(字段) 表示你创建的每一个人都有这三个变量
            self.name = name
            self.num = num
            self.birthday = birthday
    p1 = Person("alex", 18, "1840年06⽉01⽇")
    print(p1.name) # alex
    print(p1.country) #中国
    p2 = Person("wusir", 28, "1894年07⽉25⽇")
    print(p2.name) # wusir
    print(p2.country)  # 中国

      我们发现对象p1和p2的name都是对象⾃⼰的. 但是country是类的. ⼤家公⽤同⼀个变量.
      如何来验证呢?

    Person.country = "⼤清" # 在这里. 我把国家改成了大清
    p1 = Person("alex", 18, "1840年06⽉01⽇")
    print(p1.name)
    print(p1.country) # alex是大清的
    p2 = Person("wusir", 28, "1894年07⽉25⽇")
    print(p2.name)
    print(p2.country)  # wusir也是大清的

      简单的总结一下:

        实例变量,给对象用的.

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

    三 . 方法

      1.  成员方法(实例方法) : 对象直接访问的方法叫成员方法.

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

      2.静态方法: 静态方法不需要我们给方法传递self. 也就是说, 当出现一个方法不需要使用到成员变量的时候,就可以使用静态方法,静态方法需要我们在方法上面添加一个 @staticmethod

    @staticmethod
    def fare():
        print("我的电脑⾮常⽜B, 可以煎鸡蛋")

      3.类方法: 类⽅法和静态⽅法差不多, 只不过类⽅法需要在参数列表中的第⼀个位置预留⼀个位置, 通常我们给第⼀个参数起名字叫cls. 类⽅法在被调⽤的时候也不需要传递实例对象.但是. 系统会⾃动的把类传递给第⼀个参数. 类⽅法在编写的时候, 需要在类⽅法上⾯添
    加@classmethod

    class Computer:
        def play(self):
            print("我的电脑可以玩⼉")
        @staticmethod
        def fare():
            print("我的电脑⾮常⽜B, 可以煎鸡蛋")
        @classmethod
        def cal(cls, a, b):
            print(cls)
            return a+b
    print(Computer.cal(1, 2)) # 此时会自动的

    四 . 属性  

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

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

      应用场景:我们一般保存数据的时候不会保存年龄,以为时间在边年龄也在变,所以我们可以保存出生日期,然后用程序来计算,而计算属于一个功能,需要写在方法里,但是对于年龄这个属性而言,他应该是一个数值,而不是动作,所以python就提供了这样一种机制,通过方法来面熟一个属性.

      注意:
        1. ⽅法参数只能有⼀个self
        2. ⽅法上⽅要写@property
        3. 调⽤的时候, 我们不需要写括号. 直接当成属性变量来⽤就可以了.
        4. 这种套路只能取值. 不能设置值

    五 . 私有

      在python中, 一般是不提倡设置和使用私有信息的, 但有些场景我们不得不这么做, 比如,在一个公司, 每个人的收入情况, 这种内容是绝对不能公开的.

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

      1. 私有变量

    class Person:
        def __init__(self, wife, secret):
            self.__wife = wife  # 私有的
            self.__secret = secret 
        def speak(self):
            print("⼤喇叭开始⼴播了")
            return self.__secret  # 私有的内容.在他自己那里, 他可以任意的进行使用
    alex = Person("吴彦祖","最帅")
    mimi = alex.speak() # 通过一个非私有的方法, 访问到了他的秘密.
    print(secret)

      2. 私有方法

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

    class Person:
        def __init__(self):
            pass
        def __yue(self):
            print("我要约会")
        def job(self):
            print("我要⼯作")
    p = Person()
    # p.__yue() # 报错
    p.job()

      __yue是⼀个私有的⽅法. 只能在类中⾃⼰调⽤. 类外面不能访问. job 是一个成员方法,并不是一个开放的方法. 在类外界可以被访问到.

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

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

      

  • 相关阅读:
    hadoop hdfs基本命令的java编码实现
    三维空间旋转和Three.JS中的实现
    Talk about VR
    Keras bug in model.predict
    How to compile tensorflow on CentOS
    熵(Entropy),交叉熵(Cross-Entropy),KL-松散度(KL Divergence)
    Two kinds of item classification model architecture
    Three failed attempts of handling non-sequential data
    How to setup Tensorflow inception-v3 model on Windows
    (译)三维空间中的几种坐标系
  • 原文地址:https://www.cnblogs.com/attila/p/10138796.html
Copyright © 2011-2022 走看看