成员

成员

1.类的成员:在类中所写的内容就是成员。

    class 类名:
        def __init__(self,参数1,参数2...):
            # 属性变量
            self.属性1 = 参数1 
            self.属性2 = 参数2
        # 方法
        def method(self):
            pass
            
    # 在上述代码中__init__和method都属于类的成员方法,又称为实例方法。它需要对象来访问,
       而上方的self.属性1 = 参数1这个代码的含义是给对象设置属性信息。涵义是这个对象的xxx属性是xxx,
       这被称为成员变量或者实例变量再或者被称为字段。

2.类的成员-变量

    在类中变量分为两大类:

    1.实例变量(字段):每个实例对象拥有的变量。
    2.类变量(静态变量):一类事物统一拥有的变量。

      #例:
        class Person:
            # 类变量表示此类中所有的对象都共享这个变量
            country = '中国'
            def __init__(self,name,num,birthday):
            self.name = name
            self.num = num
            self.birthday = dirthday
            
        p1 = Person('alex',20,'1990年09月26日')
        print(p1.name)    # alex
        print(p1.country) # 中国
        
        
        p2 = Person('wusir',19,'1991年08月25日')
        print(p2.name)   # wusir
        print(p2.country) #中国


      # 类中的变量是共用的,如果类中变种变量发生改变,其他对象共用的这个变量时也会发生改变。如果某个对象在自身定义
      一个和类中属性相同的变量,其自身这个变量将会给变,不会影响类中变量也不会影响其他对象使用类中变量。        
      例:
        P1 = Person('alex',20,'1990年09月26日')
        p1.country = '移民'
        print(p1.name)    # alex
        print(p1.country)  # 移民
        
        p2 = Person('wusir',19,'1991年08月25日')
        print(p2.name)    # wusir
        print(p2.country) #中国


      # 类变量,最好是用类名来访问,通过对象名也可以访问但是只能看,不能改变。想要改变只能通过类名来改变。        
      例:
        class Foo:
            count = 0
            def __init__(self):
                Foo.count += 1

        print(Foo.count)  # 0
        Foo()
        Foo()
        Foo()
        print(Foo.count)   # 3

     总结:
        实例变量:给对象用的。
        类变量:多个对象共享的,最好是用类名来访问(规范)

3.类的成员-方法

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

            # 实例方法(成员方法)
            def play(self):
                print('我的电脑')

        c = Computer()
        c.play()   # 对象直接去掉用实例方法
            
            
    2.静态方法:静态方法不需要传递self,如果出现一个方法不需要使用成员变量,就可以选择静态方法,
      静态方法需要在我们的方法上加@staticmethod          
      例:
        @staticmethod
        def fare():
            print('我的电脑很厉害,可以飞')
        Computer.fare()  # 类名可以直接访问
        c.fare()   # 对象也可以访问,但最好不要这样使用,以便区分静态方法和实例方法


    3.类方法:类方法需要在参数列表的第一个位置预留一个位置,通常我们给第一个位置起名叫cls。类方法在被调用的时候不需
      传递实例对象,系统会自动的把,类传递给第一个参数,类方法在编写的时候,需要在类方法上添加@classmethod          
      例:
        class Computer:
            def play(self):
                print('我的电脑可以玩')
            @staticmethod
            def fare():
                print('我的电脑很厉害,可以飞')
            @classmethod
            def cal(cls,a,b):
                print(cls)
                return a+b
        print(Computer.cal(1,2))  # 此时会自动的把类名传递给类方法的第一个参数

4.类的成员-属性

    属性:属性其实就是通过方法改造过来的一种变量的写法,在方法上面添加一个@propety。     
    例:
        class Person:
            def __init__(self):
                pass
            @properety
            def age(self):
                return 1
        p = Person()
        age = p.age
        print(age)
    
    # 应用场景:我们一般在保存数据的时候,不会保存一个人的年龄,因为随着时间的推移,每个人的年龄都在不停的增长。
      如何保存年龄?保存出生年月日,然后用程序来计算,你当前的年龄,实时的时间。这个时候就需要进行计算了,
      计算相当于一个功能,需要写到方法里,但是对于年龄这个属性语言,它应该是一个数值,而不是动作。所以python提供了
      这样的机制,通过方法来描述一个属性。
      
    注:
        1.方法参数只能有一个self
        2.方法上方要写@property
        3.调用的时候,我们不需要写括号,直接当成属性变量来用
        4.这种套路只能取值,不能设置值              

5.私有

    在python中,一般是不提倡设置和使用私有信息的。但是有些场景就需要一些内容不公开。所以在python中使用__作为方法
    或者变量的前缀,这样这个方法或者变量就比变成了一个私有的。
    
    1.私有变量:自己设置,只能自己访问的变量     
      例:
        class Person:
            def __init__(self,laopo,mimi):
                self.__laopo = laopo    #__表示数据信息私有
                self.__mimi = mimi

        alex = Person('老婆','乡下还有个相好的')
        print(alex.__mimi)  # 私有信息,不会被执行打印
      
      报错:AttributeError: 'Person' object has no attribute '__mimi'
        
        
    私有的内容不会被访问到,但在他自己内部可以随意使用
      例:
        class Person:
            def __init__(self,laopo,mimi):
                self.__laopo = laopo
                self.__mimi = mimi
            def gaosuni(self):
                print('被发现了,公诸于世')
                return self.__mimi   # 私有内容在自己内部可随意使用

        alex = Person('老婆','乡下还有个相好的')
        mimi = alex.gaosuni()  # 通过非私有的方法,访问到他的秘密
        print(mimi) 
      
      注:私有的内容不能直接访问. 但是如果对方开辟了外界访问的通道(公共方法). 
      那可以通过这个公共的方法来获取到私有的内容. 这样做的好处是. 外界, 只能看,
      但是改不了.不单单实例变量有私有的. 类变量(静态变量)一样拥有这样的属性。          
        例:
            class Person:
                __yuwang = '人的欲望'  # 内心深处的欲望,不能让任何人知道
                def __init__(self,laopo,mimi):
                    self.__laopo = laopo
                    self.__mimi = mimi
            
                def gaosuni(self):
                    print('被发现了,公诸于世')
                    return self.__mimi

            alex = Person('老婆','乡下还有个相好的')
            mimi = alex.gaosuni()
            print(mimi)
            print(Person.__yuwang)  #  不能访问,会报错
            
            报错: AttributeError: type object 'Person' has no attribute '__yuwang'
               
      
    2. 私有方法:只能自己访问的方法,别人不能访问            
        例:
            class Person:
                def __init__(self):
                    pass
                def __yue(self):
                    print('我要约姑娘')
                def job(self):
                    print('努力工作')
            p = Person()
            p.__yue()  # 不能执行访问,会报错
      
            报错:AttributeError: 'Person' object has no attribute '__yue'
            
            注:__yue是一个私有方法,只能在类中自己调用,在类外面不能访问
                job是一个成员方法,并且是一个开放的方法,在类的外界可以被访问到     
      
      
        类中的私有方法也是相对而言的,我们可以通过其他的方法来访问到。          
        例:
            class Person:
                def __init__(self):
                    pass
                def __yue(self):
                    print('我要约姑娘')
                def job(self):
                    print('努力工作')
                    self.__yue()  # 在自己的类中访问自己的其方法,私有的自己也可以用
            p = Person()
            p.job()

      
        注:对于私有的内容而言,子类是无法继承的            
        例:
            class Fu:
                __mimi = '乡下有个相好的'
            class Zi(Fu):
                pass
            print(Zi.__mimi)  # 子类不能继承父类私有内容,会报错
                      
            报错:AttributeError: type object 'Zi' has no attribute '__mimi'
posted @ 2018-10-22 21:07  過去  阅读(224)  评论(0编辑  收藏  举报