• Day-15 面向对象02 成员


    一、类的成员-变量

      在类中变量分成两大类:

        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)   # 中国

      总结:

        实例变量:给对象用的

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

    二、类的成员-方法

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

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

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

    class Computer:
        
        @staticmethod
        def fare():
             print("我的电脑非常牛B, 可以煎鸡蛋")
    
    Computer.fare() # 类名可以直接访问的
    c.fare() # 对象也可以访问. 但最好不要这么干. 以便于区分静态方法和实例方法

      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

      注意:

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

        2.方法上方要写@property

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

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

    四、私有

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

      1.私有变量

    class Person:
        def __init__(self, laopo, mimi):
            self.__laopo = laopo # 私有的
            self.__mimi = mimi
    
    alex = Person("wusir", "他俩搞基")
    print(alex.__mimi) # 私有的. 谁都不能碰

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

    class Person:
    
        def __init__(self, laopo, mimi):
            self.__laopo = laopo # 私有的
            self.__mimi = mimi
    
        def gaosuni(self):
            print("大喇叭开始广播了")
            return self.__mimi # 私有的内容.在他自己那里, 他可以任意的进行使用
     
    alex = Person("wusir", "他俩搞基")
    mimi = alex.gaosuni() # 通过一个非私有的方法, 访问到了他的秘密. 
    print(mimi)

      记住,私有的内容不能直接访问,但是如果对方开辟了外界访问的通道(公共方法),那可以通过这个公共的方法来获取到私有的内容,这样做的好处是,外界只能看,但是改不了,不单单实例变量有私有的,类变量(静态变量)一样拥有这样的属性:

    class Person:
        __zisi = "人都是自私的" # 人都是自私的. 但是这个自私又不希望别人知道
    
        def __init__(self, laopo, mimi):
            self.__laopo = laopo # 私有的
            self.__mimi = mimi
    
        def gaosuni(self):
            print("大喇叭开始广播了")
            return self.__mimi
    
    
    alex = Person("wusir", "他俩搞基")
    mimi = alex.gaosuni()
    print(mimi)
    print(Person.__zisi) # 报错

      2.私有方法

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

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

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

    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):
        pass
    
    print(Zi.__qingfu) # 报错
  • 相关阅读:
    学会时刻总结
    JS银行卡号Luhm校验
    来京一年总结
    Linux内核同步机制 第1部分(转)
    Spinlock 简介(转)
    warning: no newline at end of file 解决(转)
    c语言 关键字 extern(转)
    MFC 线程同步(转)
    C语言 全局变量 初始化
    Linux 内核的同步机制,第 2 部分
  • 原文地址:https://www.cnblogs.com/minusone/p/9923372.html
Copyright © 2020-2023  润新知