zoukankan      html  css  js  c++  java
  • class 类的小总结

    一、类的变量

    001、类的基本方法和变量

    01、类里面有:
        类方法(实例方法):分为"静态方法""类方法",还有"成员方法"
        类变量(也叫静态变量):每一个被创建的对象都有这个类变量,可以通过"obj.类变量名" 来访问
        实例变量(也叫字段):每个对象在创建的时候,都需要__init__(self) 初始化,然后拥有这个类的实例变量
    02、修改类的类变量需要用类来改变:
        Person.aper="修改类变量"   那么,对象访问这个类变量时(obj.aper),将会显示修改后的 "修改类变量"
    03、修改实例变量可以用对象来改变,但是只针对"当前这个对象"  有用,比如:p1.name="小明",则p1.name="",  p2.name="原来的实例变量名"  p2 还是显示原来创建对象时的名字

    看下面的代码:

    class Person:
        count=0
        aper="你好" # 这个是类变量
        def __init__(self,name,age): # 实例方法或则类方法
            self.name=name  # 实例变量,创建的对象都有这几个变量
            self.age=age
            Person.count+=1
    
        def dig(self): # 实例方法或成员方法
            aper="dog的你好"
            print("实力方法dig")
    
    
    
    print(Person.count)
    p1=Person("ming",12)
    p1.aper="你不好"
    # 通过对象访问 类变量和 实例变量
    print(p1.name)
    print(p1.aper)
    
    Person.aper="你好的啊"
    
    p2=Person("ok",24)
    print(p2.aper)
    
    print(Person.count)
    结果显示:
    ''' 
    0
    ming
    你不好
    你好的啊
    2
    '''

    002、类里面的方法的说明

    01、类里面有:
        类方法(实例方法):分为"静态方法""类方法",还有"成员方法"
        
        类变量(也叫静态变量):每一个被创建的对象都有这个类变量,可以通过"obj.类变量名" 来访问
        实例变量(也叫字段):每个对象在创建的时候,都需要__init__(self) 初始化,然后拥有这个类的实例变量

    A、成员方法:其实就是对象能直接方法 (obj.method()) 访问

    class Person:
        count=0
        aper="你好" # 这个是类变量
        def __init__(self,name,age): # 实例方法或则类方法
            self.name=name  # 实例变量,创建的对象都有这几个变量
            self.age=age
            Person.count+=1
    
        def dig(self): # 实例方法或成员方法
            aper="dog的你好"
            print("实力方法dig")
    # 访问成员方法,也就是实例方法 dig()
    p1=Person("ming",45)
    p1.dig()  # 打印:  实力方法dig

    B、静态方法(staticmethod),其实就是不用给他传递参数self,不需要使用成员变量,但是需要在这个方法上加上 @staticmethod 就是静态方法了,

    关于访问静态方法,特别提醒

    一般是使用   "类名.静态方法()"  访问,例如下面的
    Person.func()  # 打印:  静态方法
    
    p1.func() # 对象也可以访问. 但最好不要这么⼲. 以便于区分静态⽅法和实例⽅法
    class Person:
        count=0
        aper="你好" # 这个是类变量
        def __init__(self,name,age): # 实例方法或则类方法
            self.name=name  # 实例变量,创建的对象都有这几个变量
            self.age=age
            Person.count+=1
    
        def dig(self): # 实例方法或成员方法
            aper="dog的你好"
            print("实力方法dig")
        
        @staticmethod  # 静态方法,不需要传值
        def func():
            print("静态方法")
            
    # 访问静态方法:
    Person.func()  #   # 打印:  静态方法

    C、 类方法,在被调用的时候,也不需要传递值,但是会给其默认为一个参数 cls ,在传递的时候,自动将类传递给这个cls,同时需要在这个方法上加上 @classmethod 来说明这是一个 类方法

    class Person:
        count=0
        aper="你好" # 这个是类变量
        def __init__(self,name,age): # 实例方法或则类方法
            self.name=name  # 实例变量,创建的对象都有这几个变量,对象可以直接访问
            self.age=age
            Person.count+=1
    
        def dig(self): # 实例方法或则类方法
            aper="dog的你好"
            print("实力方法dig")
    
        @staticmethod  # 静态方法
        def func():
            print("静态方法")
    
        @classmethod
        def func02(cls,a,b):
            print("类方法的类为:",cls)
            return a+b
    
    
    p1=Person("ming",45)
    # 通过对象访问 类方法,不建议使用对象反问类方法和静态方法,这样利于区分 实力方法和类方法,静态方法
    print(p1.func02(1,2))  # 类方法的类为: <class '__main__.Person'>   3
    
    # 通过类访问 类方法
    print(Person.func02(2,3))  # 类方法的类为: <class '__main__.Person'>    5

    003、私有变量,对象不能直接访问

    class Person:
        count=0
        aper="你好" # 这个是类变量
        def __init__(self,name,age,addr): # 实例方法或则类方法
            self.name=name  # 实例变量,创建的对象都有这几个变量
            self.age=age
            Person.count+=1
            self.__addr=addr
    
        def dig(self): # 实例方法或则类方法
            aper="dog的你好"
            print("实力方法dig")
    
        @staticmethod  # 静态方法
        def func():
            print("静态方法")
    
        @classmethod
        def func02(cls,a,b):
            print("类方法的类为:",cls)
            return a+b
    
    
    p1=Person("小白",14,"大街一号")
    # 对象访问实例变量 # 可以直接访问
    print(p1.name)    # 小白
    print(p1.age)     # 14
    # 对象访问私有变量  # 会报错,不能访问
    # print(p1.__addr)   # AttributeError: 'Person' object has no attribute 'addr'
    # 类访问私有变量  # 也不能访问
    print(Person("小黑",45,"大街34号").__addr)  # AttributeError: 'Person' object has no attribute '__addr'

    A、通过公共方法来访问私有变量

    class Person:
        count=0
        aper="你好" # 这个是类变量
        def __init__(self,name,age,addr): # 实例方法或则类方法
            self.name=name  # 实例变量,创建的对象都有这几个变量
            self.age=age
            Person.count+=1
            self.__addr=addr
    
        # 定义公共方法来访问私有变量
        def  gongg(self):
            print("公共方法访问私有变量")
            return self.__addr
        
        
        def dig(self): # 实例方法或则类方法
            aper="dog的你好"
            print("实力方法dig")
    
        @staticmethod  # 静态方法
        def func():
            print("静态方法")
    
        @classmethod
        def func02(cls,a,b):
            print("类方法的类为:",cls)
            return a+b
    # 对象通过公共方法访问私有变量
    p1=Person("小白",14,"大街一号")
    print(p1.gongg())  # 打印: 公共方法访问私有变量     大街一号
    
    # 类通过公共方法访问私有变量
    print(Person("小黑",45,"大街34号").gongg())  # 打印:  公共方法访问私有变量   大街34号

    004、私有方法 也就是单下划线的方法 def __func02(self): 这种。私有方法只能类中自己调用(方法之间互相调用)

    class Person:
        count=0
        aper="你好" # 这个是类变量
        def __init__(self,name,age,addr): # 实例方法或则类方法
            self.name=name  # 实例变量,创建的对象都有这几个变量
            self.age=age
            Person.count+=1
            self.__addr=addr
    
        # 定义公共方法来访问私有变量
        def  gongg(self):
            print("公共方法访问私有变量")
            return self.__addr
    
        def dig(self): # 实例方法或则类方法
            aper="dog的你好"
            print("实力方法dig")
    
        @staticmethod  # 静态方法
        def func():
            print("静态方法")
    
        @classmethod
        def func02(cls,a,b):
            print("类方法的类为:",cls)
            return a+b
    
        # 定义私有方法
        def __func02(self):
            print("这个是私有方法")
    p1=Person("小白",14,"大街一号")
    
    # 对象访问私有方法,无法访问
    print(p1.__func03)  # 报错:AttributeError: 'Person' object has no attribute '__func03'
    
    # 类访问私有方法,无法访问
    print(Person.__func03)  # AttributeError: type object 'Person' has no attribute '__func03'

    B、同理需要访问的话,可以定义公共的成员方法来访问这个私有方法

    class Person:
        count=0
        aper="你好" # 这个是类变量
        def __init__(self,name,age,addr): # 实例方法或则类方法
            self.name=name  # 实例变量,创建的对象都有这几个变量
            self.age=age
            Person.count+=1
            self.__addr=addr
    
        # 定义公共方法来访问私有变量
        def  gongg(self):
            print("公共方法访问私有变量")
            return self.__addr
    
        def dig(self): # 实例方法或则类方法
            aper="dog的你好"
            print("实力方法dig")
    
        @staticmethod  # 静态方法
        def func():
            print("静态方法")
    
        @classmethod
        def func02(cls,a,b):
            print("类方法的类为:",cls)
            return a+b
    
        # 定义私有方法
        def __func03(self):
            print("这个是私有方法")
    
        # 定义公共的开放方法来访问这个私有方法
        def open(self):
            return self.__func03()
    
    
    
    p1=Person("小白",14,"大街一号")
    
    # 对象通过开放方法来访问私有方法
    p1.open()
    
    # 类通过开放方法来访问私有方法
    Person("ming",45,"四号街").open()
     
  • 相关阅读:
    606. Construct String from Binary Tree
    696. Count Binary Substrings
    POJ 3255 Roadblocks (次短路)
    POJ 2823 Sliding Window (单调队列)
    POJ 1704 Georgia and Bob (博弈)
    UVa 1663 Purifying Machine (二分匹配)
    UVa 10801 Lift Hopping (Dijkstra)
    POJ 3281 Dining (网络流之最大流)
    UVa 11100 The Trip, 2007 (题意+贪心)
    UVaLive 4254 Processor (二分+优先队列)
  • 原文地址:https://www.cnblogs.com/one-tom/p/13381342.html
Copyright © 2011-2022 走看看