zoukankan      html  css  js  c++  java
  • python-类的方法与类的成员

    preface

    include:

    1. @classmethod
    2. @staticmethod
    3. @property
    4. 私有属性
    5. 类的成员
    #!/usr/bin/env python
    
    class animal(object):
        name='1990'
        def __init__(self,name):
            self.name=name
            #加了两个下划线后的变量名,此时变为了私有属性,也就是私有变量
            self.__num='private'
        def talk(self):
            print("%s are talking"%self.name)
    
    
        #类方法,不能够访问实例变量,把walk方法变成了类方法,可以直接类名.方法名调用,但是要注意的是walk里
        # 面的代码块的变量或者其他的对象都应该是类可以访问的。
        @classmethod
        def walk(self):
        #由于添加了类方法的装饰器,所以这里的%s只能用类属性(animal.name,也叫类变量)去赋值给%s,
            print("		%s are talking"%self.name)
    
        #静态方法,不再传self参数进去。所以不能够访问类变量以及实例变量,如果添加了self,那么就要在调用的时候把实例名传进去
        @staticmethod
        def habit():
            print("%s's habbit : walking"%animal.name)
        @property       #把方法变成属性,那么调用的时候可以不用加括号(),一般是为了隐藏该方法
        def runing(self):
            print("%s is running"%self.name)
        def r_private(self):
            return self.__num
    
        @property
        def total_players(self):
            return self.__num
        #这样可以修改添加了@property里面的值
        @total_players.setter
        def total_players(self,num):
            self.num=num
            print("total players:",self.num)
    
    animal.walk()
    d=animal('ljf')
    
    d.walk()
    d.habit()
    d.runing
    d.r_private()  #咱们访问私有变量一般都是写个方法,通过方法返回私有变量
    
    print(d.__num)   #下面的直接加两个下划线来访问私有属性是错误的方法
    
    d.__num='ahahh'  #通过下面的赋值的方法,等于新建了一个__num的变量。这个和私有变量__num是两码事
    print(d.__num)
    
    print(d._animal__num)   #强制访问私有变量,实例名._类名__私有变量名
    
    print(d.total_players)
    

    问如何去访问私有属性,我们一般是在类里面设定一个方法,例子:

    class a(object):
          ......省略一万字
          def access_private(self):
                 return self.__private
    
    b=a()
    b.access_private()  #如果要用比较暴力的方法去访问的话,那么就只能像下面这样操作
    b._a__private
    
    

    类的成员

    class foo(object):
        """
        this class was test
        """
        name='ljf'
        age='123'
        def __init__(self):
            self.tt='durex'
        def f1(self):
            print('ssssss')
        def __call__(self, *args, **kwargs):
            print("use call method")
    
    a=foo()
    

    __doc__ 打印类的注释信息

    print(a.__doc__)  
    

    dict 打印类里面的类变量,下面:

    • 实例.__dict__是打印实例的变量。
    • 类.__dict__是打印类或对象中的所有成员(所有变量)。
    print(a.__dict__)
    print(foo.__dict__)
    

    __call__ 这个的话是在类实例化后的对象加个括号出发,如x=class(),x()这样在实例化之后就加个()能够触发

    a()
    

    ===============================================================

    __init__() 是构造方法,在实例化的时候就会触发执行

    • __module__表示当前操作的对象在哪个模块里面
    • __class__表示当前操作的对象的类是什么

    __del__ 析构方法,当对象在内存中被释放时,自动触发执行。注:此方法一般无须定义,因为Python是一门高级语言,
    程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,
    析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

  • 相关阅读:
    Windows Server 2008 定时任务卡住了不执行
    Oracle正则表达式取得所有非匹配的查询结果
    Websphere6.1.x不打印Log4j日志问题解决办法
    js的parseInt函数结果为0很奇怪的问题
    ORA12514: TNS:listener does not currently know of service问题原因
    Windows Server 2003升级IE6到高版本系统不支持解决方法
    Windows Server 2008 定时任务卡住了不执行
    Oracle正则表达式取得所有非匹配的查询结果
    Websphere6.1.x不打印Log4j日志问题解决办法
    Hibernate保存数据自动生成主键出现奇怪异常Duplicate entry '0' for key 1
  • 原文地址:https://www.cnblogs.com/liaojiafa/p/6718159.html
Copyright © 2011-2022 走看看