python-类

1. dir(类名)

  • 查看该类的所有属性和方法。

 

2. __init__() 作为一个特殊方法,它里面一般是规定一些属性或做一些初始化,让类具有一些基本特征(属性)。但是它没有return语句,这一点是区别与其他方法的。

 

3.

  • 当类中变量引用的是不可变对象时(如字符串),类属性不因实例属性的变化而变化;实例属性跟着类属性的改变而改变。

>>class A:

>>  x = 7    %属性A.x

>>foo = A()    %创建实例A()并赋值给变量foo

>>foo.x      %实例属性

7

 

  • 当类中变量引用可变对象(如列表),类属性和实例属性都能修改这个对像,从而影响另一方的值

>>class B:

>>  y = [1,2,3]

>>bar = B()

 

>>B.y.append("aa")    %修改类属性

>>B.y

[1,2,3,"aa"]

>>bar.y

[1,2,3,"aa"]

 

>>bar.y.append(4)    %修改实例属性

>>bar.y

[1,2,3,"aa",4]

>>B.y

[1,2,3,"aa",4]

 

4. if__name__ == "__main__": 的作用
# file one.py def func(): print("func() in one.py") print("top-level in one.py") if __name__ == "__main__": print("one.py is being run directly") else: print("one.py is being imported into another module")

# file two.py import one print("top-level in two.py") one.func() if __name__ == "__main__": print("two.py is being run directly") else: print("two.py is being imported into another module")

 

如果你执行one.py文件,

python one.py

会输出:

top-level in one.py
one.py is being run directly


如果你执行two.py文件,

python two.py

会输出:

top-level in one.py
one.py is being imported into another module
top-level in two.py
func() in one.py
two.py is being run directly
先导入并执行one.py这个程序 输出top-level in one.py 然后由于onepy是被导入的,所以name不等于_main_,执行else下面的话,剩下的继续执行twopy里的条件。因为在twopy里执行,所以name等于main。继续输出。对导入的模块来说,模块中的函数是调用时才执行的,但是语句会立刻执行(就是没有缩进的那些语句,如变量赋值语句、print、if else print啊什么的),你平时导入的那些模块之所以没有输出任何内容,那是因为模块里面压根就没有上述的 print 语句。
 
 
5. 类方法

class Foo:
lang = "Java"           %类属性
  def __init__(self):
    self.lang = "python"    %实例属性
  @classmethod                    
  def get_class_attr(cls):
    return cls.lang
if __name__ == "__main__":
  print("Foo.lang:", Foo.lang)
  r = Foo.get_class_attr()
  print("get class attrbute:", r)
  f = Foo()
  print("instance attribute:", f.lang)
  print("instance get_class_attr:", f.get_class_attr())

 
@classmethod 装饰器,修饰的方法的参数中,第一个不是self, 这里使用了参数cls,用其他的也可以,只不过习惯用cls
输出:
Foo.lang: Java get class attrbute: Java instance attribute: python instance get_class_attr: Java

不管是类还是实例来执行get_class_attr(), 得到的结果都是类属性值,说明装饰器@classmethod修饰的方法,其参数cls引用的对象是类对象Foo.

5.静态方法
import random
class Foo:
  def__init__(self,name):
    self.name = name
  def get_name(self,age):
    if self.select(age):
      return self.name
    else:
      return "the name is secret"
  @staticmethod
  def select(n):
    a = random.randint(1,100)
    return a-n >0
import __name__ == "__main__":
  f = Foo("luo")
  name = f.get_name(22)
  print(name)

虽然select()函数在类里面但是和其他方法不同,它不以self为第一个参数。当使用它时,可以通过实例调用,如 self.select(n),也可以通过类调用这个方法,如 Foo.select(n).为它加上一个装饰器@staticmethod,称为静态方法。

6. 继承
C.__base__ 可以得到类的父类
子类继承父类的全部属性和方法,但若子类中的方法或属性覆盖了父类(与父类同名)---称为对父类相应部分的重写,则就不再继承父类的该方法或属性。
  • 调用覆盖的方法


      

posted @ 2017-12-13 17:34  爱学英语的程序媛  阅读(293)  评论(0编辑  收藏  举报