【问题标题】:Python OOP Factory PatternPython OOP 工厂模式
【发布时间】:2015-09-23 19:36:05
【问题描述】:

我仍在学习 OOP 设计模式,到目前为止我所阅读的所有内容都表明工厂模式是常用的。我仍在努力学习这种模式。对于我的程序,我正在创建一个名为“person”的抽象工厂,而我的名为“personFactory”的工厂应该可以让您创建不同类型的人(用户、客户、管道工等)。使用我当前的代码,我收到此错误:

AttributeError: 'NoneType' object has no attribute 'fName'

这是我的代码:

person.py

import abc

class person:
    __metaclass__ = abc.ABCMeta
    fName = ""
    mName = ""
    lName = ""
    address = ""
    city = ""
    state = ""
    zipcode = ""
    email = ""
    phone = ""
    dob = None

personFactory.py

from person import person

class personFactory(person):

    def createUser(self):
        uName = ""
        password = ""
        role = ""
        def __init__(self,uName,password,role):
            self.uName = uName
            self.password = password
            self.role = role
        def login(uName,password):
            if(uName == self.uName and password == self.password):
                return "Logged In"
            else:
                return "Did not log in"
        def logout():
            return "Logout"

    def createCustomer(self):
        items = []
        balace = 0
        def __init__(self,balance):
            self.balance = balance
        def AddToCart(item):
            self.items.append(item)
            print("Item added")
        def Order(items):
            totalprice = 0
            for item in items:
                totalprice =+ item.price
            return totalprice
        def Pay(payment):
            self.balance =- payment
            return self.balance

main.py

import personFactory

class main():
    pf = personFactory.personFactory()
    user1 = pf.createUser()
    user1.fName = "John"
    user1.lName = "Smith"
    user1.uName = "jSmith"
    user1.password = "Jamestown"

    customer1 = pf.createCustomer()
    customer1.fName = "George"
    customer1.lName = "Washington"
    customer1.balance = 100

main()

我不确定为什么 fName 是 NoneType。我究竟做错了什么?任何帮助将不胜感激!

【问题讨论】:

  • 你不能调用它,因为personFactory 是一个类。为了使用您当前的代码调用它,您首先需要在调用该方法之前创建一个类的实例。 IE。 pf = personFactory(),然后是 pf.createUser()。顺便说一句,您应该遵循PEP 8 - Style Guide for Python Code 命名类、方法和函数的编码约定。
  • 谢谢!我实际上必须添加 pf = personFactory.personFactory() 并从 person.py 中删除 init。我一定会查看 PEP 8 文档。以下更改仍未使我的程序运行。请检查我的修改。
  • 您需要非常仔细地阅读您的代码,并了解您拥有哪些类型以及您将如何尝试使用它们。
  • @IgnacioVazquez-Abrams 谢谢,但能否详细说明一下?
  • 你认为函数中的函数有什么作用?

标签: python design-patterns factory


【解决方案1】:

您在 create_user 方法中有构造函数。正如 Ignacio 所说,init 函数必须在 create_user 函数之外,以便您在创建时将名称、传递和角色传递给 person_factory 对象。

或者,您也可以将所有这些值作为参数传递给 create_user 方法,而让类构造函数不工作。

可能是这样的......

类 personFactory(person):

  def __init__(self,uName,password,role):
        self.uName = uName
        self.password = password
        self.role = role

def createUser(self):
    user = Person()
    user.type = "user"
    user.uName = self.uName
    user.password = self.password
    user.role = role
    return user

或者……

类 personFactory(person):

  def createUser(self, uName, password, role):
       user = Person()
       user.type = "user"
       user.uName = uName
       user.password = password
       user.role = role
       return user

我还建议您利用继承并根据代表每个对象的抽象类创建具体类。

喜欢...

class User(Person):

      def __init__(name, password, role):
          self.name = name
          self.type = "User"
          self.password = password

所以你可以有一个 User 类和一个 Customer 类,你工厂的每个方法都可以创建相应的对象,而不是一个普通的 Person。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-31
    • 2018-12-12
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 2017-07-31
    相关资源
    最近更新 更多