【问题标题】:Python initialize variables with default data for multiple objectsPython使用多个对象的默认数据初始化变量
【发布时间】:2020-07-02 10:31:30
【问题描述】:

我想在不带参数的构造函数中用默认值初始化变量,像这样:

class Persons()
   def __init__(self):
      self.name="Joan"

p1=Persons()
print(p1.name)

因此,结果将是“琼”。它将打印此人的姓名。都好。但是如何为多个对象执行此操作?我想用不同的名字打印p2.namep3.name,就像上面一样。

我从一个要求我“创建一个没有参数的构造函数,用默认数据初始化变量”的练习中得到这个。

【问题讨论】:

  • “我想打印 p2.name , p3.name, 用不同的名字” - 如果你想让所有对象都使用默认值,那么它们都将具有相同的名称。
  • 您可以从一个列表中随机选择:self.name = random.choice(["Joan", "Alice", "Bob", ...],但不能保证(即使创建的对象多于可用名称的情况)每个实例都会有一个唯一的名称。
  • 练习中是否真的说实例变量每次需要不同的初始化?

标签: python class oop object constructor


【解决方案1】:

只需添加名称作为参数:

class Persons()
   def __init__(self, name):
      self.name = name
p1=Persons(“Joan”)
print(p1.name)

或者

p1.name = “Jim”

【讨论】:

  • 是的,可以,但是练习说构造函数应该没有参数,在这种情况下只有一个参数:“name”
【解决方案2】:

如果您的类可以提供一组可能的名称,您可以创建一个对象,每次调用 Person.__init__ 时都会获得不同的名称。例如:

from itertools import cycle

class Person:
    names = cycle(["Alice", "Bob", "Carol", "Dan"])

    def __init__(self):
        self.name = next(Person.names)

根据需要向池中添加任意数量的名称。

一旦最初的名称集用完并且循环再次开始,名称必然会重复。再做一些工作,我们至少可以改变每个周期产生名称的顺序:

from itertools import cycle
import random


class Person:
    def shuffled_cycle(names):
        while True:
            random.shuffle(names)
            yield from names

    names = shuffled_cycle(["Alice", "Bob", "Carol", "Dan"])

    def __init__(self):
        self.name = next(Person.names)

当然,如果不担心重复的名字,只需从__init__ 内部调用random.choice。这要简单得多:

import random


class Person:
    def __init__(self):
        self.name = random.choice(["Alice", "Bob", "Carol", "Dan"])

极端地说,只是从原始字母汤中生成随机名称:

import random
import string

class Person:
    def __init__(self):
        k = random.randint(3, 10)
        self.name = ''.join(random.sample(string.ascii_lowercase, k)).title()

【讨论】:

    【解决方案3】:

    所以问题是您想使用默认值进行初始化,您编写的代码是正确的。“Person”类的每个新实例都将使用相同的默认值进行初始化,这是很好的编码习惯。因为它是“默认”值因此相同。但是,为了了解知识,我编写了一个小程序,可以为 Person 类的 5 个新实例赋予新名称,但是不要在生产中使用它,因为这是一种不好的做法,但对学习很有好处。

    class Person :
        #class Variable
        name_list=["Jhon","Naruto","James","Smith","Neo"]
        instance_count = 0
    
        def __init__(self):
            #Resets instance count when instances become greater that 5
            instance_count = instance_count%5  
    
            #Sets new name
            self.name = name_list[instance_count]
    
            #increment instance_count
            instance_count = instance_count + 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      相关资源
      最近更新 更多