拾遗之读写操作,输出时存在的主题材料

方式生龙活虎(列表深入解析式):

__dict__

  • Python 中,一切皆对象
  • 任由是类依然实例的属性和方法,都手足之情 object.attribute 格式。并且属性类型
class A(object):
    pass
a = A()
dir(a)

输出:

    ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__','__eq__','__format__','__ge__','__getattribute__','__gt__','__hash__','__init__','__init_subclass__','__le__','__lt__', '__module__','__ne__','__new__', '__reduce__', '__reduce_ex__','__repr__','__setattr__', '__sizeof__', '__str__', '__subclasshook__','__weakref__']

class Spring(object):
    season = 'the spring of class'
Spring.__dict__

输出:

    mappingproxy({'__dict__': <attribute '__dict__' of 'Spring' objects>,
                  '__doc__': None,
                  '__module__': '__main__',
                  '__weakref__': <attribute '__weakref__' of 'Spring' objects>,
                  'season': 'the spring of class'})

#访问的是类属性
print(Spring.__dict__['season'])
print(Spring.season)

输出:

 'the spring of class'

#访问的是实例属性,因为class中没有定义实例属性所以打印为空
s = Spring()
s.__dict__

输出:

 {}

s.season    #访问的类属性

输出:

 'the spring of class'

#为class 的实例 中添加一个 season 属性
s.season = "instance";
s.__dict__

输出:

{'season': 'instance'}

#当类属性和实例属性重名时,实例属性会覆盖掉类属性
s.__dict__['season']

输出:

'instance'

#但是类属性不会变
Spring.__dict__['season']

输出:

'the spring of class'

Spring.season

输出:

 'the spring of class'

#删除实例属性后,就回到了实例化类的时候的状态,没有实例属性,只有类属性
del s.season
s.__dict__

输出:

    {}

s.season  #类属性

输出:

    'the spring of class'

#属性和方法是同样的
class Spring_def(object):
    def tree(self,x):
        self.x= x
        return self.x

Spring_def.__dict__

输出:

 mappingproxy({'__dict__': <attribute '__dict__' of 'Spring_def' objects>,
                  '__doc__': None,
                  '__module__': '__main__',
                  '__weakref__': <attribute '__weakref__' of 'Spring_def' objects>,
                  'tree': <function __main__.Spring_def.tree>})

Spring_def.__dict__['tree']

输出:

    <function __main__.Spring_def.tree>

t = Spring_def()
t.__dict__

输出:

    {}

t.tree('value')
t.__dict__

输出:

    {}

class Spring_no(object):
    def tree(self,x):
        return x

ts = Spring_no()
ts.tree('No arg')
ts.__dict__

输出:

    {}

Spring_no.__dict__

输出:

    mappingproxy({'__dict__': <attribute '__dict__' of 'Spring_no' objects>,
                  '__doc__': None,
                  '__module__': '__main__',
                  '__weakref__': <attribute '__weakref__' of 'Spring_no' objects>,
                  'tree': <function __main__.Spring_no.tree>})

  刚上学Java时首先个接触的method便是System.out.println(卡塔尔(英语:State of Qatar)方法。可是方今在行使它输出一些变量时出现了本人不晓得的光景,首先上代码:

        目前直接在学C#语言,在写一些顺序的时候难免蒙受C#输入输出的主题材料,除了葛老师讲的部分东西,作者也在看英特网的某个有关C#程序设计的录像疏解,在见到C#流程序调整制构造的那豆蔻年华章节,见到了一个很好的关于C#读写操作的叁个例证。那一个事例正是优秀的for迭代语句编写“小九九表”。

list1 = ["abc","efg","hij"]
list2 = [i[0] for i in list1]
print list2

__slots__

  • 可见范围属性的概念
  • 优化内存使用
  • __dict__替换成__slots__
  • 用类给五天性能赋值后,实例就不能够给那个个性赋值了。
  • 也不可能增加生产本领实例属性,那样就把品质管理调整了起来。内部存储器获得优化
  • 汪洋实例的话会显现出效果
class Spring_s(object):
    __slots__ = ("tree","flows")
dir(Spring_s)

输出:

    ['__class__','__delattr__','__dir__','__doc__','__eq__', '__format__','__ge__','__getattribute__', '__gt__','__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__','__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',  '__slots__', '__str__',   '__subclasshook__', 'flows',  'tree']

Spring_s.__dict__

输出:

mappingproxy({'__doc__': None,
                  '__module__': '__main__',
                  '__slots__': ('tree', 'flows'),
                  'flows': <member 'flows' of 'Spring_s' objects>,
                  'tree': <member 'tree' of 'Spring_s' objects>})

Spring_s.__slots__

输出:

    ('tree', 'flows')

ts = Spring_s()
ts.__slots__

输出:

    ('tree', 'flows')

#使用__slots__后就没有__dict__ 属性了
ts.__dict__

输出:

#错误
    ---------------------------------------------------------------------------

    AttributeError                            Traceback (most recent call last)

    <ipython-input-40-f3db88226dd5> in <module>()
          1 #使用__slots__后就没有__dict__ 属性了
    ----> 2 ts.__dict__


    AttributeError: 'Spring_s' object has no attribute '__dict__'

Spring_s.tree = "liushu"
Spring_s.tree

输出:

    'liushu'

# 报错中显示 实例属性 tree 只是制度的,不能修改
ts.tree = "yangshu"

输出:

#错误
    ---------------------------------------------------------------------------

    AttributeError                            Traceback (most recent call last)

    <ipython-input-42-d6b9cb191c20> in <module>()
          1 # 报错中显示 实例属性 tree 只是制度的,不能修改
    ----> 2 ts.tree = "yangshu"


    AttributeError: 'Spring_s' object attribute 'tree' is read-only

ts.tree

输出:

    'liushu'

  • 前方早就由此类给属性赋值了,就无法用实例属性来改进。
  • 当使用实例给属性赋值后,依然得以再用实例来给属性赋值,可是当那些天性被类赋值后,就不可能再用实例给属性赋值了,只可以用类来给属性赋值.
#第一次实例赋值
ts.flows = "meigui"
ts.flows

输出:

    'meigui'

#第二次实例赋值
ts.flows = "yueji"
ts.flows

输出:

    'yueji'

#使用类赋值
Spring_s.flows = "shuixianhua"
Spring_s.flows

输出:

 'shuixianhua'

#实例的属性的值会变成类属性的值
ts.flows

输出:

    'shuixianhua'

#再用实例给属性赋值就会报只读错误
ts.flows = "qianniuhua"

输出:

#错误
    ---------------------------------------------------------------------------

    AttributeError                            Traceback (most recent call last)

    <ipython-input-48-726c06affe50> in <module>()
          1 #再用实例给属性赋值就会报只读错误
    ----> 2 ts.flows = "qianniuhua"


    AttributeError: 'Spring_s' object attribute 'flows' is read-only

Spring_s.flows = "baihe"
Spring_s.flows

输出:

    'baihe'

ts.flows

输出:

    'baihe'

  • 实例中增加属性
# 新增实例失败 
ts.water = "green"

输出:

#错误
    ---------------------------------------------------------------------------

    AttributeError                            Traceback (most recent call last)

    <ipython-input-52-cde7efd2f5b8> in <module>()
    ----> 1 ts.water = "green"


    AttributeError: 'Spring_s' object has no attribute 'water'

  

         第生机勃勃种输出格式的代码:

  

__getattr____setattr__ 和别的雷同方法

  • __setattr__(self,name,value): 借使要给name赋值,就调用这几个方法
  • __getattr__(self,name): 要是name被访谈,同事它不设有,此形式被调用
  • __getattribute__(self,name): 当name被访谈时自动被调用(注意:这一个仅能用来新式类),无论name是不是存在,都要被调用
  • __delattr__(self,name): 若是要删减name,那几个主意就被调用。
class B(object):
    pass
b = B()
b.x 

输出:

    ---------------------------------------------------------------------------

    AttributeError                            Traceback (most recent call last)

    <ipython-input-42-f8f5c58b62c7> in <module>()
          2     pass
          3 a = A()
    ----> 4 a.x


    AttributeError: 'A' object has no attribute 'x'

x 不是势力的成员(属性和艺术)所以报错。也正是说,若是访谈 b.x ,它不设有,那么就要转向到有些操作 ,大家把这种处境叫做“拦截”。

class C(object):
    def __getattr__(self,name):
        print('you use getattr')
    def __setattr__(self,name,value):
        print('you use setattr')
        self.__dict__[name] = value

类C是新式类,出来2个主意,未有其余属性

c = C()
c.x

输出:

    you use getattr

当然依据伊始class B 是要报错的。可是出于这里运用了 __getattr__(self,name) 当开掘x不设有与指标__dict__ 时,就能够调用__getattr“拦截成员” 。

c.x = 7

输出:

    you use setattr

给指标的性质赋值是,调用了__setattr__(self,name,value)主意,那几个艺术有一句 self.__dict__[name] = value通过那个讲话,就将质量和数目保存到了对象的 __dict__中。若是再调用这几个天性:

c.x  # x 已经存在于对象的 __dict__中

输出:

    7

使用__getattribute__(self,name):,只要访谈属性就能调用它

class getAt(object):
    def __getattribute__(self,name):
        print('使用了getattribute')
        return object.__getattribute__(self,name)

at = getAt()
at.y

输出:

    使用了getattribute



    ---------------------------------------------------------------------------

    AttributeError                            Traceback (most recent call last)

    <ipython-input-54-6e81b53b32de> in <module>()
          1 at = getAt()
    ----> 2 at.y


    <ipython-input-53-a6779a4b213a> in __getattribute__(self, name)
          2     def __getattribute__(self,name):
          3         print('使用了getattribute')
    ----> 4         return object.__getattribute__(self,name)


    AttributeError: 'getAt' object has no attribute 'y'

  • 拜会一个不设有的性质,即使拦截了但依旧报错了。
  • 可是蓬蓬勃勃旦赋值后就可以访谈了,因为那样就代表做个属性已经存在于__dict__中了。纵然依然被拦截,不过会把结果回到。
at.y = 9
at.y

输出:

    使用了getattribute
    9

瞩目:这里未有 return self.__dict__[name],因为只要用这么的措施访谈self.__dict__意气风发经访谈那么些办法,就能够去调用__getattribute__,那样就能够Infiniti递归下去,变成死循环。

 1 /*
 2 *
 3 * using method System.out.println/print
 4 *
 5 *
 6 */
 7 class Student{
 8 
 9     String name ;
10     Student(String name){
11         this.name = name ;
12     }
13     void show (){
14         System.out.println("name is :"   name );
15     }
16 
17 }
18 public class TestOutString {
19 
20 public static void main(String[] args){
21     int varInt = 1 ;
22     char varChar = 'h';
23     String varString = "hello world !";
24     int[] intArray = {1,2,3};
25     char[] charArray = {'1','2','3','4'};
26     Student studentObject = new Student("first");
27     Student[] studentArray = {new Student("1"),new Student("2"),new Student("3")};
28     String[] stringArray = {"1","2","3","4"};
29     boolean[] booleanArray = {true , false , true , false};
30     
31     
32     System.out.println(varInt);
33     System.out.println(varChar);
34     System.out.println(varString);
35     System.out.println(intArray);
36     System.out.println(charArray);
37     System.out.println(studentObject);
38     System.out.println(studentArray);
39     System.out.println(stringArray);
40     
41     /*
42     Result :
43     
44             1
45             h
46             hello world !
47             [I@54477b4e
48             1234
49             Student@20f0691c
50             [LStudent;@784be29
51             [Ljava.lang.String;@1be0799a
52             
53     Question : 
54     
55     we will get different value by using method--'System.out.println/print' 
56     
57     to output some variables with different type
58     
59     */
            for (int i = 1; i <=9; i  )
            {
                for (int j = 1; j <= i; j  )
                {
                    Console.Write("{0}*{1}={2}", i, j, i * j);
                }
            }
           Console.ReadLine();

方法二(普通写法):

示例:
''' study __getattr__  and  __setattr__'''
class Rectangle(object):
    ''' the width  and length of Rectangle'''
    def __init__(self):
        self.width = 0
        self.height = 0
    def setSize(self,size):
        self.width,self.height = size
    def getSize(self):
        return self.width,self.height
if __name__ == "__main__":
    r = Rectangle()
    r.width = 3
    r.height = 4
    print (r.getSize())
    r.setSize((30,40))
    print(r.width)
    print(r.height)

输出:

    (3, 4)
    30
    40

长度宽度赋值的时候必需是七个元组,里面富含长度宽度。改过。。。

class Rectangle_2(object):
    ''' 使用property改进调用方法传参'''
    def __init__(self):
        self.width = 0
        self.height = 0
    def setSize(self,size):
        self.width,self.height = size
    def getSize(self):
        return self.width,self.height
    #---------新加---------#
    size = property(getSize,setSize)
    #---------结束---------#
if __name__ == "__main__":
    r = Rectangle_2()
    r.width = 3
    r.length = 4
    print(r.size)
    r.size = 30, 40
    print (r.width)
    print (r.length)

输出:

    (3, 0)
    30
    4

就算措施调用好似属性相通,可是并未有用上特殊格局。继续修正。。。

class Rectangle_3(object):
    '''使用特殊方法'''
    def __init__(self):
        self.width = 0
        self.height = 0
    def __setattr__(self, name, value):
        if name == "size":
            self.width, self.height = value
        else:
            self.__dict__[name] = value
    def __getattr__(self, name):
        if name == "size":
            return self.width,self.height
        else:
            return AttributeError

if __name__ == "__main__":
    nr = Rectangle_3()
    nr.width = 3
    nr.height = 4
    print(nr.size)
    nr.size = 30,40
    print(nr.width)
    print(nr.height)

输出:

    (3, 4)
    30
    40

图片 1

             输出的结果格式为:

list1 = ["abc","efg","hij"]
list2 = []
for i in range(len(list1)):
    list2.append(list1[i][0])
print list2

获得属性顺序

  • 由此实例获取其质量,固然在__dict__中有,就直接再次来到其结果,若无,就能够到类属性中找。
class search(object):
    author = 'Python'
    def __getattr__(self , name):
        if name != 'author':
            return '查询的不是author属性'
if __name__ == '__main__':
    a = search()
    print(a.author)
    print(a.none)
    print(a.__dict__)

输出:

    Python
    查询的不是author属性
    {}

  • 带头化后 a 没有创造任何实例属性。实例属性__dict__是空,未有属性值,a.author 则有值,因为是类属性,而实例中又不曾,所以就去类属性中去找,所以就回去了'Python'
  • 当a.none 的时候不独有实例中绝非,类中也绝非,所以就调用了__getattr__方法。若是不写__getattr__主意就能报错了。
  • 这就是 通过实例查找天性的依次

仿照效法:《跟着老齐学Python:从入门到明白》 小编:齐伟 电子工业出版社

由上前后相继能够看看:

图片 2

  

  使用System.out.println()输出骨干数据类型和char数组时符合规律,可是在出口int、string、object、object数组、Boolean数组时现身只输出附近  '类名 @ 生龙活虎串十八进制的数'  的字符串。开采原因有以下几点:

 

输出:

  1. System.out.println()(是PrintStream类的分子方法)方法只提供了以下二种数据类型输出的重载函数:

              第两种输出格式的代码:

['a', 'e', 'h']
['a', 'e', 'h']

  图片 3

            for (int i = 1; i <=9; i  )
            {
                for (int j = 1; j <= i; j  )
                {
                    Console.WriteLine("{0}*{1}={2}", i, j, i * j);
                }
            }
           Console.ReadLine();

  

  所以我们在出口  boolean 、 char 、char【】 、 double 、float 、int 、 long 数据时会输出其相应的值。对于object的出口System.out.println方法会首先调用其     toString方法,然后将该对象的toString方法的重临值输出。关于toString方法的切实可行输出会在底下表达。

            输出的结果格式为:

情势豆蔻梢头和方法二输出相符,是等价的

  1. 由于System.out.println没有对int[] 、String[] 、 object[] 数组输出的重载函数,所以在采取该方式输出那些数据类型时,该方法会将此中的参数作数组首成分来比较。也就  是说,System.out.println(intArray) 等价于   System.out.println(intArray[0])。然后调用数组首成分的toString方法,并将其出口。

图片 4

  toString()方法:

 

    是装有目的的超类,它的意义是回去一个字符串,那么些字符串由  调用它的类的类名 @ 调用它的类的哈希值十九进制表示格局  组成。

          第两种输出格式的代码:

    即 :getClass().getName() '@' Integer.toHexString(hashCode())

            for (int i = 1; i <=9; i  )
            {
                for (int j = 1; j <= i; j  )
                {
                    Console.Write("{0}*{1}={2}", i, j, i * j);
                }
                Console.WriteLine();
            }
           Console.ReadLine()

  由以上多个原因应该能够收获地点输出结果是由哪些导致的了。

             输出的结果格式为:

 

图片 5

这就是说怎么样让自家定义的多寡直接通过System.out.println输出其值呢 ?

 

 

              第各个输出格式的代码:

我认为:

            for (int i = 1; i <=9; i  )
            {
                for (int j = 1; j <= i; j  )
                {
                    Console.WriteLine("{0}*{1}={2}", i, j, i * j);
                }
                Console.WriteLine();
            }
           Console.ReadLine()

 对于System.out.println()帮忙的数据类型例如: int 、 double、char【】 等能够一贯输出其值。

             输出的结果格式为:

对此Object类型的多寡,能够重写它的toString(卡塔尔方法,依据本身的主张输出。因为System.out.println输出object类型值时就是调用其toString方法。

 

对于System.out.println不帮衬的数据类型譬喻 : int[] / double[] / String[] /boolean 等,能够运用类集,举个例子 ArrayList等,

图片 6

1 ArrayList<Integer> intList = new ArrayList<Integer>();
2 intList.add(1);
3 intList.add(2);
4 intList.add(3);
5 intList.add(4);
6 System.out.println(intList);

 

如此就能够输出其值

                   
         很生硬是第两种输出格式大家更愿意接收,那样对于“小九九表”的出口一览无余。那二种输出的格式便展现了C#语言中的读写操作。下边就来讲Write(卡塔尔(قطر‎方法,WriteLine(卡塔尔(قطر‎方法,Read(卡塔尔国方法和ReadLine(卡塔尔方法的分别。

图片 7

        1,Write()方法

自然借让你对那样的输出相当不够满足,也一直以来能够重写ArrayLIst等类集框架的toString方法,因为System.out.println方法在输出ArrayList等类集变量时正是调用其toString方法。

        Console.Write(卡塔尔(قطر‎方法,光标会停在输出字符串的终极一个字符后,不会活动到下生龙活虎行。标准的正是“小九九表”的率先种输出格局。

 

        2,WriteLine()方法

        Console.WriteLine(""卡塔尔时,将会输出括号中包蕴的其它表达式(转义符除了这一个之外),后跟二个行终止(lineterminator卡塔尔,即换行符。规范的正是“小九九表”的第两种输出方式。

        3,Read()方法

        Console.Read(卡塔尔(قطر‎方法是打字与印刷键盘输入字符,并积累成ASC码的样式,再次来到值是int类型。

        4,ReadLine()方法

        Console.ReadLine(卡塔尔方法读取大器晚成行字符,再次来到string型。

        5,ReadKey()方法

        Console.ReadKey(卡塔尔方法读取二个字符,按任意键重返。

       下边来举二个事例来评释Read(卡塔尔国方法(ReadKey(卡塔尔(英语:State of Qatar)方法卡塔尔(قطر‎:

                  Console.WriteLine("请输入字符");
            int c = Console.Read();
            int d = Console.Read();
            Console.WriteLine(c " " d);
            Console.ReadKey();//不能改为ReadLine,否则输入数据后会一闪而过

          键入"aa",输出的是:

图片 8

 

             下边再来举二个例子来注脚ReadLine(卡塔尔国方法(ReadKey(卡塔尔方法卡塔尔(قطر‎:

                  Console.WriteLine("请输入字符串");
            string a = Console.ReadLine();
            Console.WriteLine(a);
            Console.ReadKey()//不能改为ReadLine,否则输入数据后会一闪而过

              键入"aa",输出的为;

图片 9

 

            在蒙受要求输入的数额不鲜明数据类型时,能够用ReadLine(卡塔尔国方法,再用调换Convert方法进行各样数据类型的退换。在日前的顺序例题中早已运用过,就不在比方表达了。

        

       

 

 

                

              

 

     

 

 

     

       

      

 

            

 

         

      

本文由星彩网app下载发布于计算机编程,转载请注明出处:拾遗之读写操作,输出时存在的主题材料

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。