zoukankan      html  css  js  c++  java
  • 类中的成员

    类中的成员:字段、方法、属性

    1、字段

    字段:普通字段、静态字段

    1 class Mycalss:
    2     str = '这是静态字段'
    3     def __init__(self,str1):
    4         self.str1 = str1 # 普通字段
    5 # 实例化对象
    6 a = Mycalss('普通字段')
    7 print(a.str1) #访问静态字段
    8 print(Mycalss.str)

     执行结果

    普通字段
    这是静态字段

      普通字段:属于对象,由对象来访问,在内存中每个对象都要保存一份

      静态字段:属于类,由类直接访问,在内存中只保存一份

    2、方法

    方法:普通方法、静态方法、类方法

     1 class Myclass(object):
     2     doc = '静态字段'
     3     def __init__(self, argu1, argu2 ,):
     4         self.argu1 = argu1
     5         self.argu2 = argu2
     6     def func1(self):  #普通方法 至少一个self
     7         print('普通方法')
     8     @staticmethod # 静态方法,任意参数
     9     def func2():
    10         print('静态方法')
    11     @classmethod  #类方法,只能一个cls
    12     def func3(cls):
    13         print('类方法',cls)#执行时它会把当前的类当成参数传进去
    14 # 创建对象
    15 c = Myclass(123, 'hello world')16 c.func1() #访问普通方法

    执行结果:

    普通方法
    静态方法
    类方法 <class '__main__.Myclass'> #执行时它会把当前的类当成参数传进去

    普通方法:先创建一个对象,在用对象去调用这个方法

    静态方法:直接用类调用,可以有任意参数(静态方法可以让类直接调用,省去了普通方法创建对象的步骤)

    类方法:直接用类调用,只能一个cls参数

    3、属性

    属性定义两种方法:装饰器定义、静态字段定义

    (1)装饰器定义属性

     1 class Myclass(object):
     2     doc = 'This is a test'
     3     def __init__(self,argu):
     4         self.argu = argu
     5     def func1(self):#方法
     6         print('方法')
     7     @property
     8     def func2(self):  #属性,加上@property装饰器,仅有一个self参数
     9         print('属性')
    10 #创建对象
    11 a = Myclass(2222)
    12 a.func1()  #调用方法
    13 a.func2 # 调用属性
    执行结果>>> 15 方法 16 属性

    在方法上加上@property装饰器就叫属性,属性和方法的区别就是调用时不用加括号

    在新式类中,除了@property,还有另外两种装饰器

     1 class School(object):
     2     def __init__(self, name, age):
     3         self.name = name
     4         self.age = age
     5     @property
     6     def classroom(self):    # 属性,加上@property装饰器,仅有一个self参数
     7         print(self.name, self.age)
     8     @classroom.setter
     9     def classroom(self, age):
    10         self.age = age    # 把age修改为传入的参数
    11         print("修改", self.name, self.age)
    12     @classroom.deleter
    13     def classroom(self):
    14         del self.age        # 删除age
    15         print("删除", self.name, self.age)
    16 
    17 # 创建对象a1
    18 a1 = School("张三", 18)
    19 a1.classroom    #1.执行后会自动调用@property方法
    20 a1.classroom = 20     #2.执行后会自动调用@classroom.setter的方法,并将20传给age参数
    21 del a1.classroom    #3.执行后会自动调用@classroom.deleter的方法

    执行结果

    张三 18
    Traceback (most recent call last):
    修改 张三 20
      File "E:/Python-Advanced/面向对象/类中的成员/属性/装饰器1.py", line 21, in <module>
        del a1.classroom    #3.执行后会自动调用@classroom.deleter的方法
      File "E:/Python-Advanced/面向对象/类中的成员/属性/装饰器1.py", line 15, in classroom
        print("删除", self.name, self.age)
    AttributeError: 'School' object has no attribute 'age'

    (2)静态字段定义的属性

     1 class School(object):
     2     def __init__(self,name,age):
     3         self.name=name
     4         self.age=age
     5 
     6     def classroom(self):
     7         print(self.name,self.age)
     8 
     9     def classroom_update(self,age):
    10         self.age=age    #把age修改为传入的参数
    11         print("修改",self.name,self.age)
    12 
    13     def classroom_del(self):
    14         del self.age        #删除age
    15         print("删除",self.name,self.age)
    16 
    17     obj=property(classroom,classroom_update,classroom_del)  #静态字段方式定义属性
    18 
    19 #创建对象a1
    20 a1=School("张三",18)
    21 a1.obj  #1.执行后会自动调用classroom方法
    22 a1.obj=20     #2.执行后会自动调用classroom_update的方法,并将20传给age参数
    23 del a1.obj    #3.执行后会自动调用classroom_delr的方法

    4、公有成员和私有成员

    在类中的每一个成员都有两种形式:公有、私有

    公有:都可以访问      私有:只有在类的内部可以访问

    举例——字段:

     1 class School(object):
     2     deg="" #公有静态字段
     3     __cat=""   #私有静态字段
     4     def __init__(self,name,age):
     5         self.name=name  #公有普通字段
     6         self.__age=age  #私有普通字段
     7 
     8     def dormitory(self):
     9         print(self.__age)
    10 
    11     def cat(self):
    12         print(School.__cat)
    13 
    14 #创建对象a1
    15 a1=School("张三",18)
    16 #访问普通字段
    17 print(a1.name)  #输出:张三
    18 print(a1.age)   #报错,提示没有age,因为age是私有字段,只能间接内部访问
    19 a1.dormitory()  #只能通过类内部访问私有字段
    20 #访问静态字段
    21 print(School.deg)   #输出:狗
    22 print(School.__cat) #报错
    23 a1.cat()        #输出:猫   可以间接通过内部的cat方法反问私有静态字段

    方法

     1 class School(object):
     2 
     3     def __init__(self, name, age):
     4         self.name = name
     5         self.__age = age
     6 
     7     def cat(self):  # 公有方法
     8         print("cat")
     9 
    10     def __dog(self):   # 私有方法
    11         print("dog")
    12 
    13     def doo(self):  #内部访问私有方法
    14         a1.__dog()
    15 #创建对象a1
    16 a1 = School("张三",18)
    17 a1.cat()    #输出:cat
    18 # a1.__dog()    #报错
    19 a1.doo()    # 输出:dog  间接通过doo方法反问私有方法__dog
    20
    a1._School__dog() # 强制访问
    
    

    如果想要强制访问私有字段,可以通过(对象._类名__私有字段名)访问,不建议强制访问私有成员。

    5、类的特殊成员

    (1)__doc__

    1 class Myclass(object):
    2     '''类的描述信息'''
    3     def __init__(self, argu):
    4         self.argu = argu
    5
    6 print(Myclass.__doc__) #输出:类的描述信息

    (2)__init__

      在上面已经说过,在创建对象是自动执行

    (3)__del__

    当对象在内存中被释放时,自动触发执行

    1 class Myclass(object):
    2     '''类的描述信息'''
    3     def __init__(self, argu):
    4         self.argu = argu
    5     def __del__(self):
    6         print('对象内存已被释放')
    7 
    8 a = Myclass('hello world')
    9 print(a.argu)

    执行结果:

    hello world
    对象内存已被释放

    (4)__call__

    在创建的对象后面加括号执行时,会自动执行类里的__call__方法

    1 class Myclass(object):
    2 
    3     def __call__(self, *args, **kwargs):
    4         print("触发__call__方法")
    5 
    6 a1=Myclass()
    7 a1()    #输出:触发__call__方法
    8 Myclass()()  #输出:触发__call__方法

    (5)__dict__

    获取类或对象的所有成员

    class School(object):
        """类的描述信息"""
        cat=""
        def __init__(self,name,age):
            self.name=name
            self.__age=age
        def dog(self):
            print("dog")
    
    print(School.__dict__)  #获取类中的成员
    a1=School("张三",18)
    print(a1.__dict__)  #获取对象中的成员
    '''
    输出:
    {'cat': '猫', '__init__': <function School.__init__ at 0x000000000226C950>, '__dict__': <attribute '__dict__' of 'School' objects>,
    '__weakref__': <attribute '__weakref__' of 'School' objects>, '__module__': '__main__', 'dog': <function School.dog at 0x000000000226CAE8>, '__doc__': '类的描述信息'} {'name': '张三', '_School__age': 18}
    '''

    (6)__str__

    1 class School(object):
    2     def __init__(self,name,age):
    3         self.name=name
    4         self.__age=age
    5 
    6     def __str__(self):
    7         return("print对象时的返回值")
    8 a1=School("张三",18)
    9 print(a1)   #输出:print对象时的返回值
  • 相关阅读:
    HTTP协议
    JavaScript学习(一)
    Cookie&Session
    注解初学
    反射初学
    XML
    Web概念
    Response对象
    Servlet
    LeetCode Notes_#617 Merge Two Binary Trees
  • 原文地址:https://www.cnblogs.com/weststar/p/11420865.html
Copyright © 2011-2022 走看看