本文已参加「新人创造礼」活动,一同敞开创造之路。

python创立类

1.创立类

如下界说一个动物类Animal为基类,它基本两个实例特点name和age、一个办法call。

class people:
  #界说基本特点
  name = ''
  age = 0
  #界说私有特点,私有特点在类外部无法直接进行访问
  __weight = 0
  #界说结构办法
  def __init__(self,n,a,w):
    self.name = n
    self.age = a
    self.__weight = w
  def speak(self):
    print("%s 说: 我 %d 岁。" %(self.name,self.age))
 
# 实例化
p = people('runoob',10,30)
p.speak()

2.承继

class Animal(object): #  python3中所有类都能够承继于object基类
  def __init__(self, name, age):
    self.name = name
    self.age = age
​
  def call(self):
    print(self.name, '会叫')
​
######
# 现在咱们需求界说一个Cat 猫类承继于Animal,猫类比动物类多一个sex特点。 
######
class Cat(Animal):
  def __init__(self,name,age,sex):
    super(Cat, self).__init__(name,age) # 不要忘掉从Animal类引入特点
    self.sex=sex
​
if __name__ == '__main__': # 单模块被引用时下面代码不会受影响,用于调试
  c = Cat('喵喵', 2, '男') #  Cat承继了父类Animal的特点
  c.call() # 输出 喵喵 会叫 ,Cat承继了父类Animal的办法 

留意:留意: 一定要用 super(Cat, self).init(name,age) 去初始化父类,否则,承继自 Animal的 Cat子类将没有 name和age两个特点。 函数super(Cat, self)将返回当时类承继的父类,即 Animal,然后调用init()办法,留意self参数已在super()中传入,在init()中将隐式传递,不能再写出self。

3.重构

class Cat(Animal):
  def __init__(self, name, age, sex):
    super(Cat, self).__init__(name,age)
    self.sex = sex
​
  def call(self):
    print(self.name,'会“喵喵”叫')
​
if __name__ == '__main__':
  c = Cat('喵喵', 2, '男')
  c.call() # 输出:喵喵 会“喵喵”叫

留意:类办法的调用次序,当咱们在子类中重构父类的办法后,Cat子类的实例先会在自己的类 Cat 中查找该办法,当找不到该办法时才会去父类 Animal 中查找对应的办法。

4.Python中子类与父类的联系

class Animal(object):
  pass
​
class Cat(Animal):
  pass
​
A= Animal()
C = Cat()

子类与父类的联系是 “is” 的联系,如上 Cat 承继于 Animal 类,咱们能够说:

“A”是 Animal 类的实例,但,“A”不是 Cat 类的实例。

“C”是 Animal 类的实例,“C”也是 Cat 类的实例。

判别目标之间的联系,咱们能够经过 isinstance (变量,类型) 来进行判别:

print('"A" IS Animal?', isinstance(A, Animal))
print('"A" IS Cat?', isinstance(A, Cat))
print('"C" IS Animal?', isinstance(C, Animal))
print('"C" IS Cat?', isinstance(C, Cat))

输出结果:

"A" IS Animal? True
"A" IS Cat? False
"C" IS Animal? True
"C" IS Cat? True

拓展: isinstance() 判别变量类型

函数 isinstance() 不止能够用在咱们自界说的类,也能够判别一个变量的类型,如判别数据类型是否为 int、str、list、dict 等。

print(isinstance(100, int))
print(isinstance('100', int))
print(isinstance(100, str))
print(isinstance('100', str))

输出:

True
False
False
True

5.python 中多态

类具有承继联系,并且子类类型能够向上转型看做父类类型,假如咱们从 Animal 派生出 Cat和 Dog,并都写了一个 call() 办法,如下示例:

class Animal(object):
   def __init__(self, name, age):
       self.name = name
       self.age = age
   def call(self):
       print(self.name, '会叫')
class Cat(Animal):
   def __init__(self, name, age, sex):
       super(Cat, self).__init__(name, age)
       self.sex = sex
   def call(self):
       print(self.name, '会“喵喵”叫')
class Dog(Animal):
   def __init__(self, name, age, sex):
       super(Dog, self).__init__(name, age)
       self.sex = sex
   def call(self):
       print(self.name, '会“汪汪”叫')

咱们界说一个 do 函数,接收一个变量 ‘all’,如下:

def do(all):
   all.call()
A = Animal('小黑',4)
C = Cat('喵喵', 2, '男')
D = Dog('旺财', 5, '女')
for x in (A,C,D):
   do(x)

输出结果:

小黑 会叫
喵喵 会“喵喵”叫
旺财 会“汪汪”叫

小常识:多态

这种行为称为多态。也就是说,办法调用将作用在 all 的实践类型上。C 是 Cat 类型,它实践上具有自己的 call() 办法以及从 Animal 承继的 call 办法,但调用 C .call() 总是先查找它本身的界说,假如没有界说,则顺着承继链向上查找,直到在某个父类中找到停止。

传递给函数 do(all) 的参数 all 纷歧定是 Animal 或 Animal 的子类型。任何数据类型的实例都能够,只要它有一个 call() 的办法即可。其他类不承继于 Animal,具备 call 办法也能够运用 do 函数。这就是动态言语,动态言语调用实例办法,不检查类型,只要办法存在,参数正确,就能够调用。

python批量树立目标

办法一:

class Blog:
   def __init__(self,num):
       print("a new object num is",num)
       self.value = num
   def __str__(self):
       return str(self.value+3)
# 循环树立四个目标,locals()函数能够将字符串转换为变量名!
#详细的操作和含义我并不清楚,大家能够自行百度
for i in range(1,5):
    locals()['blog_'+str(i)] = Blog(i)
#验证是否有blo_3这个目标变量
print(blog_3)

作用:

('a new object num is', 1)
('a new object num is', 2)
('a new object num is', 3)
('a new object num is', 4)
3

办法二:


class bianyuan(custom):
    cj = 430080
    def __init__(self, name, data, cj):
        super(bianyuan, self).__init__(name)
        self.cj = cj
        self.data = data
    def distribute(self, slip):
        self.data = self.data + slip
flag = 1  ##设置flag,用于批量命名目标
for name in m_qos_suit_keys:
    # for i in range(1,101):
    if flag<101:
        locals()["bianyuan_"+str(flag)] = bianyuan(name, 0, m_limit.get(name))  ##批量命名目标
        flag += 1
bianyuan_1.distribute(slip)
bianyuan_2.distribute(slip)
bianyuan_3.distribute(slip)
print(bianyuan_1.data)
print(bianyuan_1.name)
print(bianyuan_2.data)
print(bianyuan_2.name)

\