Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
New to Python and oop
#1
I am attempting to write a Python object-oriented program to control the state of three relays. My partial solution isn't eloquent. Can you please show me how to duplicate the below code using proper oop code?
Thank you in advance.
Bob

# relay1 = is controlled via pin 37
# relay2 = is controlled via pin 38
# relay3 = is controlled via pin 40

class Relays:
    def __init__(self, relay_num, relay_state):
        self.relay_num = relay_num # relay1, relay2 or relay3
        self.relay_state = relay_state # 1 = on, 2 = off

relay1 = Relays(1, 0)
relay2 = Relays(2, 1)
relay3 = Relays(3, 1)

print(relay1.relay_num)
print(relay1.relay_state)
print('-----')

print(relay2.relay_num)
print(relay2.relay_state)
print('-----')

print(relay3.relay_num)
print(relay3.relay_state)
print('-----')
Reply
#2
You can remove the duplicated code
# relay1 = is controlled via pin 37
# relay2 = is controlled via pin 38
# relay3 = is controlled via pin 40
 
class Relays:
    def __init__(self, relay_num, relay_state):
        self.relay_num = relay_num # relay1, relay2 or relay3
        self.relay_state = relay_state # 1 = on, 2 = off
 
relay1 = Relays(1, 0)
relay2 = Relays(2, 1)
relay3 = Relays(3, 1)

for relay in (relay1, relay2, relay3):
    print(relay.relay_num)
    print(relay.relay_state)
    print('-----')
Reply
#3
Thank you!

In a perfect opp world, should each relay be a method of class Relay? Perhaps, I asked the wrong question. How should one model a three relay system using oop techniques?
Reply
#4
No each relay should not be a method of its self.
Methods in relay will do something with their own instance of relay.

Define a three relay system
Reply
#5
A three relay system as defined in my original post.
Reply
#6
The original post is just creating 3 instances of relay and outputting their attributes, i don't see any sign of a system or what you are referring to when you say system.
Reply
#7
Understood. Thank you again for your assistance.
Reply
#8
I would say your current class is actually the system. So from OOP perspective I would say you need a class for the relay and a class for the system (i.e. some changes to your current class).

Very basic example - i.e. a lot can be changed, improved, made differently, you can add extra helper attributes, etc.

class Relay:
    def __init__(self, relay_id=None, state=False):
        self.id = relay_id
        self.state = state
        
    def toggle(self):
        self.state = not self.state
        
        
class RelaySystem:
    def __init__(self, num_relays=0):
        self.relays = tuple(Relay(relay_id=f'{rel_id}') for rel_id in range(num_relays))
        
    def set_all(self, state=False):
        for relay in self.relays:
            relay.state = state
            
    def print_report(self):
        print(f'Relay system with {len(self.relays)} relays.')
        for relay in self.relays:
            print(f"Relay id={relay.id} is {'ON' if relay.state else 'OFF'}")
        print()



if __name__ == '__main__':          
    relay_board = RelaySystem(3)
    
    relay_board.relays[0].state=True
    relay_board.print_report()

    relay_board.set_all(True)
    relay_board.print_report()
                
    relay_board.relays[2].toggle()
    relay_board.print_report()
Output:
Relay system with 3 relays. Relay id=0 is ON Relay id=1 is OFF Relay id=2 is OFF Relay system with 3 relays. Relay id=0 is ON Relay id=1 is ON Relay id=2 is ON Relay system with 3 relays. Relay id=0 is ON Relay id=1 is ON Relay id=2 is OFF >>>
If you can't explain it to a six year old, you don't understand it yourself, Albert Einstein
How to Ask Questions The Smart Way: link and another link
Create MCV example
Debug small programs

Reply
#9
Thank you Buran!
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020