一、类方法种类

1.静态方法(@staticmethod)

  1. class Dog(object):
  2. def __init__(self):
  3. pass
  4.  
  5. @staticmethod
  6. def talk(): #静态方法
  7. pass

  静态方法与类没什么关系了,名义上归类管,但无法管理该方法。talk()中不自动传入self参数。

  注意:静态函数无法直接调用类或对象中的属性和方法,如果需要调用类属性和其他静态方法,需使用 类名.类属性名 或类名.静态方法名 来调用。如果需要调用对象属性和方法,则需要将对象作为参数传入静态函数,并使用该对象来调用。

2.类方法(@classmethod)

  1. class Dog(object):
  2. type = "gloden"
  3.  
  4. def __init__(self,name):
  5. self.name=name
  6.  
  7. @staticmethod
  8. def talk():
  9. print("talking")
  10.  
  11. def eat(self):
  12. pass
  13.  
  14. @classmethod
  15. def foo(cls,hello):
  16. cls.talk() #类方法中只能调用静态方法
  17. print(cls.type) #类方法中只能调用类变量
  18.  
  19. d = Dog("dd")
  20. d.foo("gogogo")

  上述代码中的foo就是一个类方法,第一个参数是cls,代表会自动将Dog类作为参数传入该方法。然后使用cls调用静态方法talk()。

  注意:类方法只能调用类中的静态方法,也只能调用类变量。

3.属性方法(@property)

  将一个方法变为一个静态属性。看实例:

  1. class Flight(object):
  2. def __init__(self,name):
  3. self.name=name
  4.  
  5. def check_status(self): #航班实时状态只有航空公司知道,该函数调航空公司接口获取状态码
  6. print("check status of Flight [%s] ." % (self.name))
  7. return 1
  8.  
  9. @property
  10. def flight_status(self): #将该函数当做一个属性,但是可以实时的调用check_status方法来获取当前航班状态。(类似去哪儿网)
  11. stat = self.check_status()
  12. if stat == 0:
  13. print("Flight canceled")
  14. elif stat == 1:
  15. print("Flight arrived")
  16. elif stat == 2:
  17. print("Flight departured")
  18. else:
  19. print("Flight Can't confirmed")
  20. return stat
  21.  
  22. f = Flight("CA980")
  23. s = f.flight_status #用查看属性的方法来调用,并且可以使用变量接收返回值
  24. print(s) #输出状态码1

  如果要给属性方法flight_status参数:

  1. class Flight(object):
  2. def __init__(self,name):
  3. self.name=name
  4. self.__test = None
  5.  
  6. def check_status(self): #航班实时状态只有航空公司知道,该函数调航空公司接口获取状态码
  7. print("check status of Flight [%s] ." % (self.name))
  8. return 1
  9.  
  10. @property
  11. def flight_status(self): #将该函数当做一个属性,但是可以实时的调用check_status方法来获取当前航班状态。(类似去哪儿网)
  12. stat = self.check_status()
  13. print(self.__test) #在这里打印私有变量__test,
  14. if stat == 0:
  15. print("Flight canceled")
  16. elif stat == 1:
  17. print("Flight arrived")
  18. elif stat == 2:
  19. print("Flight departured")
  20. else:
  21. print("Flight Can't confirmed")
  22. return stat
  23.  
  24. @flight_status.setter
  25. def flight_status(self,test):
  26. self.__test = test
  27.  
  28. f = Flight("CA980")
  29. f.flight_status = "hello" #使用setter传入参数test
  30. f.flight_status

  上述代码中使用@flight_status.setter来修饰flight_status(self,hello)方法。必须放在属性方法的后面,也就是说使用@flight_status.setter,前面必须已经存在flight_status属性方法。setter修饰的方法主要用来传参,将传入的参数test保存在一个私有属性中,在调用属性方法flight_status时就可以使用该私有属性了。

  

  如果要删除该私有属性:

  1. class Flight(object):
  2. def __init__(self,name):
  3. self.name=name
  4. self.__test = None
  5.  
  6. def check_status(self): #航班实时状态只有航空公司知道,该函数调航空公司接口获取状态码
  7. print("check status of Flight [%s] ." % (self.name))
  8. return 1
  9.  
  10. @property
  11. def flight_status(self): #将该函数当做一个属性,但是可以实时的调用check_status方法来获取当前航班状态。(类似去哪儿网)
  12. stat = self.check_status()
  13. print(self.__test) #在这里打印私有变量__test,
  14. if stat == 0:
  15. print("Flight canceled")
  16. elif stat == 1:
  17. print("Flight arrived")
  18. elif stat == 2:
  19. print("Flight departured")
  20. else:
  21. print("Flight Can't confirmed")
  22. return stat
  23.  
  24. @flight_status.setter #给属性方法传参
  25. def flight_status(self,test):
  26. self.__test = test
  27.  
  28. @flight_status.deleter #删除属性方法关联的私有属性
  29. def flight_status(self):
  30. del self.__test
  31.  
  32. f = Flight("CA980")
  33. f.flight_status = "hello" #使用setter传入参数test
  34. del f.flight_status #调用deleter删除__test
  35. f.flight_status #这里因为删除了__test,所以会报错'Flight' object has no attribute '_Flight__test'

  总结:属性方法的目的就是隐藏实现细节,例如flight_status中的实现细节,对于用户来说看到的好像就是一个静态属性。

四、类的其他内容

1.__doc__

  __doc__:获取类的注释

  1. class Person(object):
  2. """这是一个描述人的类"""
  3. def __init__(self):
  4. pass
  5.  
  6. print(Person.__doc__)

  上述代码中,使用""" """或者''' '''或者" "或者' '都可以。

2.__module__

  __module__:获取当前操作的类或对象所属的类属于哪个模块

  1. #importfile.py
  2.  
  3. class Dog(object):
  4. def __init__(self):
  5. pass
  1. #classother.py
  2. import importfile
  3.  
  4. d = importfile.Dog()
  5. print(d.__module__) #输出importfile

3.__class__

  __class__:使用当前操作对象获取属于哪个类

  1. print(d.__class__) #输出<class 'importfile.Dog'>

4.__call__

  __call__:可以使用 对象名+括号的方式调用类中的__call__方法。

  1. class Dog(object):
  2. def __init__(self):
  3. pass
  4.  
  5. def __call__(self,*args,**kwargs):
  6. print("__call__ ",args,kwargs)
  7.  
  8. d = Dog()
  9. d(1,2,3,4,name="xiaohua") #打印__call__ (1, 2, 3, 4) {'name': 'xiaohua'}

  或者使用类名()()调用:

  1. Dog()(1,2,3,4,name="xiaohua")

5.__dict__

  __dict__:查看类或对象中的所有成员。

  1. class Dog(object):
  2. feet = 4
  3. def __init__(self,name,age):
  4. self.name = name
  5. self.__age = age
  6.  
  7. def eat(self):
  8. pass
  9.  
  10. def __call__(self,*args,**kwargs):
  11. print("__call__ ",args,kwargs)
  12.  
  13. d = Dog("xiaohua",23)
  14. print(d.__dict__) #{'name': 'xiaohua', '_Dog__age': 23} 对象里只有成员属性,不包含静态属性和方法(方法属于类)
  15. print(Dog.__dict__) #{'__module__': '__main__', 'feet': 4, '__init__': <function Dog.__init__ at 0x0078F8E8>, 'eat': <function Dog.eat at 0x00794810>, '__call__': <function Dog.__call__ at 0x007948A0>, '__dict__': <attribute '__dict__' of 'Dog' objects>, '__weakref__': <attribute '__weakref__' of 'Dog' objects>, '__doc__': None}

6.__str__

  __str__:默认打印一个对象信息。

  1. d = Dog("xiaohua",23)
  2. print(d) #<__main__.Dog object at 0x00AEEC70>

  默认应该打印上述信息,描述一个对象属于的类和地址。

  可以通过重载__str__方法来修改该信息:

  1. class Cat(object):
  2. def __init__(self,name):
  3. self.name=name
  4.  
  5. def __str__(self):
  6. return "This is object [%s]" % (self.name)
  7.  
  8. c = Cat("miaowu")
  9. print(c) #打印This is object [miaowu]

7.__getitem__、__setitem__、__delitem__

  __getitem__、__setitem__、__delitem__:使对象支持字典操作

  1. class Foo(object):
  2.  
  3. def __getitem__(self,key):
  4. print("__getitem__",key)
  5.  
  6. def __setitem__(self,key,value):
  7. print("__setitem__",key,value)
  8.  
  9. def __delitem__(self,key):
  10. print("__delitem__",key)
  11.  
  12. obj = Foo()
  13. result = obj["k1"] #是对象可以像字典一样操作
  14. obj["k2"] = "Alex"
  15. del obj["k1"]

8.__getattr__和__setattr__

在python的类中,有两个很重要的特殊方法__getattr__(self,item)和__setattr__(self,key,value):

  1. class Foo(object):
  2. def __getattr__(self, item):
  3. print(item)
  4.  
  5. def __setattr__(self, key, value):
  6. print(key, value)

这两个方法是在使用该类对象进行"."操作的时候会被调用。例如:

  1. if __name__ == '__main__':
  2. obj = Foo()
  3. obj.name = 'Alex' # __setattr__被调用,打印name Alex
  4. obj.age # __getattr__被调用,打印age

注意,我们平时在使用对象的"."操作时,一般不会定义这两个方法。所以默认情况下,都会找到object类的__setattr__和__getattr__来执行,而object类的这两个方法默认的功能就是设置属性和获取属性的值。

如果我们在自己定义的类中重写了这两个方法,那么就可以自己设置"."操作的行为。

考虑以下特殊场景:(构造函数的属性初始化也会触发__setattr__方法)

  1. class Foo(object):
  2. def __init__(self):
  3. self.storage = {}
  4.  
  5. def __getattr__(self, item):
  6. print(item)
  7.  
  8. def __setattr__(self, key, value):
  9. print(key, value)
  10.  
  11. if __name__ == '__main__':
  12. obj = Foo()
  13. obj.name = 'Alex'

在该类的构造方法中,我们初始化了一个对象属性storage。那么按照我们前面所叙述的__setattr__的触发机制。这里应该打印以下信息:

  1. storage {}
  2. name Alex

即,构造函数中的self.storage = {}也会触发__setattr__方法。因为self代表Foo的对象obj(由__new__(Foo)产生),然后使用"."操作设置了storage。

三、类怎么来的

Python中一切皆对象,所以类也是对象,是type的实例化对象。

1.通过Type类来产生类

  类定义的普通模式:

  1. class Foo(object):
  2. def __init__(self):
  3. pass
  4.  
  5. f = Foo()

  类定义的特殊模式:

  1. def test_func(self): #这里必须要有self,因为该方法要装载进类Goo中
  2. print("[name] : %s , [age] : %s" % (self.name,self.age))
  3.  
  4. def init_func(self,name,age): #给Goo定义一个__init__方法
  5. self.name=name
  6. self.age=age
  7.  
  8. Goo = type("Goo",(object,),{"goo_func":test_func,"__init__":init_func})
  9. print(type(Goo)) #打印<class 'type'>
  10.  
  11. g = Goo("Leo",32)
  12. print(type(g)) #打印<class '__main__.Goo'>
  13. g.goo_func() #调用了前面定义好的test_func,goo_func是该方法在类中的方法名

  总结:类是由type类实例化产生的,哪type类是从哪里来的,答案是type是由python解释器直接实现的。

2.__new__()

  __new__:用于实例化对象

  1. class Foo(object):
  2. def __init__(self,name):
  3. self.name = name
  4. print("Foo __init__")
  5.  
  6. def __new__(cls, *args, **kwargs):
  7. print("Foo __new__")
  8. return object.__new__(cls)
  9.  
  10. f = Foo("Leo") #在实例化f时,先执行的是__new__,后执行__init__

  如果将__new__中的return object.__new__(cls)注释掉:

  1. class Foo(object):
  2. def __init__(self,name):
  3. self.name = name
  4. print("Foo __init__")
  5.  
  6. def __new__(cls, *args, **kwargs):
  7. print("Foo __new__")
  8. #return object.__new__(cls)
  9.  
  10. f = Foo("Leo") #只执行了__new__,而__new__中只进行了打印

  结论,说明__new__方法中返回的object.__new__(cls)真正实现了对f的实例化。而且__init__是由__new__来调用触发的。

3.__metaclass__

  __metaclass__:用于指定类用哪个类来实例化(即用type还是自定义的type派生类)

  以python 2.7的类实例化过程为例(python 3.x有所不同,但大同小异)

  1. class Mytype(type):
  2. def __init__(self, what, bases=None, dict=None):
  3. print("---MyType init ---")
  4. super(Mytype,self).__init__(what, bases,dict)
  5.  
  6. def __call__(self, *args, **kwargs):
  7. print("---MyType call---")
  8. obj = self.__new__(self, *args, **kwargs)
  9. self.__init__(obj, *args, **kwargs)
  10.  
  11. class Foo(object):
  12. __metaclass__ = Mytype
  13.  
  14. def __init__(self,name):
  15. self.name = name
  16. print("Foo __init__")
  17.  
  18. def __new__(cls, *args, **kwargs):
  19. print("Foo __new__")
  20. return object.__new__(cls)
  21.  
  22. f = Foo("Leo")

  以上代码是使用MyType类来实例化Foo类,然后实例化Foo的对象f。

  如果把__call__中的最后两句代码注释掉,则Foo中的__new__和__init__都不会执行。具体的执行过程如下图:

  过程解释:

  1.MyType默认调用type父类的__new__产生一个类实例,即Foo。

  2.然后调用__init__初始化Foo。

  3.obj实例化的时候,MyType中的__call__会执行

  4.__call__中调用Foo中的__new__来生成obj实例

  5.__call__调用Foo中的__init__来初始化obj实例

四、反射

1.hasattr()

hasattr(obj,"func_name"):判断一个对象中是否存在指定方法。

  1. class Dog(object):
  2. def __init__(self,name):
  3. self.name = name
  4.  
  5. def eat(self,food):
  6. print("%s is eating %s" % (self.name,food))
  7.  
  8. d = Dog("XiaoHua") #初始化d
  9. func_name = input(":>>").strip() #输入想调用的方法名
  10.  
  11. print(hasattr(d,func_name)) #输入eat,打印true

2.getattr()

getattr():获取该方法指针。并执行。

  1. class Dog(object):
  2. def __init__(self,name):
  3. self.name = name
  4.  
  5. def eat(self,food):
  6. print("%s is eating %s" % (self.name,food))
  7.  
  8. d = Dog("XiaoHua") #初始化d
  9. func_name = input(":>>").strip() #输入想调用的方法名
  10.  
  11. if hasattr(d,func_name): #输入eat,打印true
  12. func = getattr(d,func_name) #获取成员方法指针
  13. func("Baozi") #调用该方法

3.setattr()

setatter(x,y,v):给对象添加属性或方法用,参数解释:x.'y' = v,x是对象,'y'是字符串,z是该属性的值。若要添加方法,v就是一个方法指向的地址。

  1. def bulk(self):
  2. print("%s is yelling" % {self.name})
  3.  
  4. class Dog(object):
  5. def __init__(self,name):
  6. self.name = name
  7.  
  8. def eat(self,food):
  9. print("%s is eating %s" % (self.name,food))
  10.  
  11. d = Dog("XiaoHua") #初始化d
  12. func_name = input(":>>").strip() #输入想调用的方法名
  13.  
  14. if hasattr(d,func_name): #输入eat,打印true
  15. func = getattr(d,func_name) #获取成员方法指针
  16. func("Baozi") #调用该方法
  17. else:
  18. setattr(d,func_name,bulk) #假设输入的方法名是hello,对象d中会被创建一个叫hello(self)的成员方法
  19.  
  20. func = getattr(d,func_name) #获取该方法指针
  21. func(d) #调用该方法,但是self参数必须手工传(注意)

  设置一个成员变量:

  1. setattr(d,attr_name,55) #设置一个成员变量
  2. print( getattr(d,attr_name) ) #打印该成员变量的值

  如果要修改前面设置的变量值:

  1. setattr(d,attr_name,66) #再次使用setattr覆盖

  删除成员变量:(删除添加的成员方法不行)

  1. delattr(d,attr_name)
  2. print( getattr(d,attr_name) ) #报错,说没有这个成员属性

五、异常处理

1.异常处理

  1. list = []
  2.  
  3. try:
  4. print(list[1]) #列表中没有元素,访问报错
  5. except Exception as err: #捕获异常,并把异常的信息复制给err
  6. print("err is : ",err) #打印异常详细信息

  按异常种类来捕获异常:

  1. names = []
  2. dicts = {}
  3.  
  4. try:
  5. print(names[1]) #列表中没有元素,访问报错
  6. dicts['key']
  7.  
  8. except IndexError as idx_err: #捕获IndexError异常
  9. print("err is : ",idx_err) #打印异常详细信息
  10.  
  11. except KeyError as key_err: #捕获KeyError异常
  12. print("err is : ",key_err)

  一次捕获所有种类的异常:(不建议直接使用,异常信息不够准确,建议用在最后补漏)

  1. names = []
  2. dicts = {}
  3.  
  4. try:
  5. print(names[1]) #列表中没有元素,访问报错
  6. dicts['key']
  7.  
  8. except Exception as e: #捕获所有种类的异常
  9. print("err is : ",e) #打印异常详细信息

  出现未知错误:

  1. try:
  2. print(names[1]) #列表中没有元素,访问报错
  3. dicts['key']
  4.  
  5. except IndexError as idx_err: #捕获IndexError异常
  6. print("err is : ",idx_err) #打印异常详细信息
  7. except KeyError as key_err: #捕获KeyError异常
  8. print("err is : ",key_err)
  9. except Exception as e:  #建议在最后使用Exception
  10. print("出现未知错误 ",e)

  一切正常时:

  1. try:
  2. print(names[1]) #列表中没有元素,访问报错
  3. dicts['key']
  4.  
  5. except IndexError as idx_err: #捕获IndexError异常
  6. print("err is : ",idx_err) #打印异常详细信息
  7. except KeyError as key_err: #捕获KeyError异常
  8. print("err is : ",key_err)
  9. except Exception as e:
  10. print("出现未知错误 ",e)
  11. else:
  12. print("一切正常")  #一切正常时会执行,当出现异常时不执行

  不管错不错都要执行:

  1. try:
  2. print(names[1]) #列表中没有元素,访问报错
  3. dicts['key']
  4.  
  5. except IndexError as idx_err: #捕获IndexError异常
  6. print("err is : ",idx_err) #打印异常详细信息
  7. except KeyError as key_err: #捕获KeyError异常
  8. print("err is : ",key_err)
  9. except Exception as e:
  10. print("出现未知错误 ",e)
  11. else:
  12. print("一切正常")
  13. finally:
  14. print("不管有误错误都执行")

  常用的几种异常类型:

  • AttributeError :试图访问个对象没有的属性,如foo.x,但是foo中没有x属性。
  • IOError :输入输出异常。
  • ImportError :无法引入模块或包,基本上是路径问题或名称错误。
  • IndentationError :语法错误(的子类),代码没有正确对齐。
  • IndexError : 下标索引超出序列边界。
  • KeyError :试图访问字典里不存在的键。
  • SyntaxError :代码非法,代码不能编译。
  • TypeError :传入对象类型与要求的不符合。
  • ValueError:传入了一个调用者不期望的值,即使值的类型是正确的。

2.自定义异常

自定义异常:

  1. def test_func():
  2. test_num = input(">>")
  3. if int(test_num) < 10:
  4. raise MyException("test_func方法中,test_num < 10")
  5.  
  6. class MyException(Exception): #自定义异常继承于Exception
  7. def __init__(self,msg): #实例化时传参
  8. self.msg = msg
  9.  
  10. def __str__(self): #异常错误信息
  11. return self.msg
  12.  
  13. try:
  14. test_func()  #当输入的数字小于10时,触发raise MyException
  15. except MyException as err:
  16. print("捕捉到异常:",err)

六、网络Socket编程

1.实现socket的流程

  实现一个socket至少要分成以下几个步骤(伪代码):

  1. #伪代码
  2. Socket socket = getSocket(type = 'tcp') #设定好协议类型
  3. connect(socket, address = '1.2.3.4', port = '') #连接远程机器
  4. send(socket, 'HelloWorld!') #发送消息
  5. close(socket) #关闭连接

  Socket Familyies(地址簇):

  socket.AF_UNIX  #unix本机进程间通信

  socket.AF_INET  #IPv4

  socket.AF_INET6  #IPv6

  Socket Type:

  socket.SOCK_STREAM  #TCP

  socket.SOCK_DGRAM  #UDP

  socket.SOCK_RAW  #原始套接字,普通套接字无法处理ICMP、IGMP等报文。

2.Socket简单示例

  客户端:

  1. import socket #引入socket模块
  2.  
  3. client = socket.socket() #声明socket类型,同时生成socket连接对象
  4. client.connect(('localhost',6969)) #连接远程socket
  5.  
  6. client.send("我爱你".encode("utf-8")) #python3.x中只能发送byte类型,2.x可以发送字符串
  7.  
  8. data = client.recv(1024) #等待接收来自远程的数据
  9. print("recv : ",data.decode())
  10. client.close() #关闭socket

  服务器端:

  1. import socket #引入socket模块
  2.  
  3. server = socket.socket() #创建socket实例
  4. server.bind(("localhost",6969)) #绑定监听网卡和端口
  5. server.listen() #开始监听
  6.  
  7. conn,addr = server.accept() #等待接受客户端连接请求,并将连接实例赋值给conn,对端地址赋值给addr
  8. print(conn,addr) #打印<socket.socket fd=536, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 6969), raddr=('127.0.0.1', 50251)> ('127.0.0.1', 50251)
  9.  
  10. data = conn.recv(1024) #使用conn接受数据
  11. print("Recv : ",data.decode())
  12. conn.send((data.decode()+"你好").encode()) #使用conn发送数据
  13.  
  14. server.close() #关闭socket

  上述代码只是简单描述了一下socket如何创建和使用的。能够支持多客户端、多并发的socket在后面实现。

###

Python自学day-7的更多相关文章

  1. python自学笔记

    python自学笔记 python自学笔记 1.输出 2.输入 3.零碎 4.数据结构 4.1 list 类比于java中的数组 4.2 tuple 元祖 5.条件判断和循环 5.1 条件判断 5.2 ...

  2. Python - 自学django,上线一套资产管理系统

    一.概述 终于把公司的资产管理网站写完,并通过测试,然后上线.期间包括看视频学习.自己写前后端代码,用时两个多月.现将一些体会记录下来,希望能帮到想学django做web开发的人.大牛可以不用看了,小 ...

  3. 拎壶冲冲冲专业砸各种培训机构饭碗篇----python自学(一)

    本人一直从事运维工程师,热爱运维,所以从自学的角度站我还是以python运维为主. 一.python自学,当然少不了从hello world开始,话不多说,直接上手练习 1.这个可以学会 print( ...

  4. [Python自学] day-21 (2) (Cookie、FBV|CBV装饰器)

    一.什么是Cookie 1.什么是Cookie? Cookie是保存在客户端浏览器中的文件,其中记录了服务器让浏览器记录的一些键值对(类似字典). 当Cookie中存在数据时,浏览器在访问网站时会读取 ...

  5. [Python自学] day-21 (1) (请求信息、html模板继承与导入、自定义模板函数、自定义分页)

    一.路由映射的参数 1.映射的一般使用 在app/urls.py中,我们定义URL与视图函数之间的映射: from django.contrib import admin from django.ur ...

  6. [Python自学] day-20 (Django-ORM、Ajax)

    一.外键跨表操作(一对多) 在 [Python自学] day-19 (2) (Django-ORM) 中,我们利用外键实现了一对多的表操作. 可以利用以下方式来获取外键指向表的数据: def orm_ ...

  7. [Python自学] day-19 (2) (Django-ORM)

    一.ORM的分类 ORM一般分为两类: 1.DB first:先在DB中创建数据库.表结构,然后自动生成代码中的类.在后续操作中直接在代码中操作相应的类即可. 2.Code first:直接在代码中实 ...

  8. [Python自学] day-19 (1) (FBV和CBV、路由系统)

    一.获取表单提交的数据 在 [Python自学] day-18 (2) (MTV架构.Django框架)中,我们使用过以下方式来获取表单数据: user = request.POST.get('use ...

  9. [Python自学] day-18 (2) (MTV架构、Django框架、模板语言)

    一.实现一个简单的Web服务器 使用Python标准库提供的独立WSGI服务器来实现MVC架构. 首先,实现一个简单的Web服务器: from wsgiref.simple_server import ...

  10. Python自学之路---Day13

    目录 Python自学之路---Day13 常用的三个方法 匹配单个字符 边界匹配 数量匹配 逻辑与分组 编译正则表达式 其他方法 Python自学之路---Day13 常用的三个方法 1.re.ma ...

随机推荐

  1. QT之二级菜单(二级菜单的箭头可以使用QSS设置图片)

    QT之二级菜单 QT之二级菜单 开场白 效果图 上代码 可参考文章 下代码 结尾 开场白 今天我们一起来了解下,在我们QT中,二级菜单是如何实现的,在上篇我们学习了QT之系统托盘,QT之自定义菜单,  ...

  2. 向西项目管理工具Git一片

    前言 Git 这个词相信大家并不陌生,做开发的童鞋们每天都离不开它.当然,假设你的项目中没实用到分布式,那么,你可能从未用过 Git,当然也可能没听过.只是,这不是重点,重点是这一篇文章,我们将一起谈 ...

  3. P和P1指向了O和O1两个变量(对象)的地址, 而不是O和O1的内容(对象的实际地址)——充分证明@是取变量(对象)的地址,而不是变量里面的内容,够清楚!

    如图,为什么这样取出来的p,p1的值不一样呢?   165232328群友庾伟洪告诉我:  P和P1指向了O和O1两个变量(对象)的地址, 而不是O和O1的内容(对象的实际地址) ,你想P指向真正的对 ...

  4. Unity3d 鼠标的事件GetMouseButtonDown()、GetMouseButton()、GetMouseButtonUp()

    当鼠标按键按下时,返回一次true,后面參数0是左键,1是右键,2是中键 if(Input.GetMouseButtonDown(0)) Debug.Log("Pressed left cl ...

  5. C# WinForm 文件上传下载

    /// <summary> /// WebClient上传文件至服务器 /// </summary> /// <param name="fileNamePath ...

  6. vim for windows download and installation

    这是vim皇冠vim简要 ------------------------------------------------- WHAT IS VIM Vim is an almost compatib ...

  7. Swift - 关于 Optional 的一点唠叨

    Optional 是 Swift 的一个非常重要的特性,它除了提供类型安全的机制,也是 Swift 中很多语言特性的核心.当然,使用 Optional 时也要了解很多坑,这样能帮助我们更好的运用它. ...

  8. NoSQL Manager for Cassandra 3.2.0.1 带Key

    NoSQL Manager for Cassandra 3.2.0.1 是一个Windows平台下Cassandra 数据库的高级管理工具.请低调使用. NoSQLManagerforCassandr ...

  9. 在 Laravel 中通过 Artisan View 扩展包创建及删除应用视图文件

    1.简介 本扩展包添加了两个视图相关的Artisan命令到Laravel应用,以便我们通过Artisan命令即可创建和管理视图文件,可谓是进一步解放了生产力. 2.安装 还是通过Composer安装: ...

  10. Win8 Metro(C#)数字图像处理--2.59 P分位法图像二值化

    原文:Win8 Metro(C#)数字图像处理--2.59 P分位法图像二值化  [函数名称]   P分位法图像二值化 [算法说明]   所谓P分位法图像分割,就是在知道图像中目标所占的比率Rat ...