Python Forum
New to Python and oop - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: New to Python and oop (/thread-17607.html)



New to Python and oop - SpongeBob - Apr-17-2019

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('-----')



RE: New to Python and oop - Yoriz - Apr-17-2019

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('-----')



RE: New to Python and oop - SpongeBob - Apr-17-2019

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?


RE: New to Python and oop - Yoriz - Apr-17-2019

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


RE: New to Python and oop - SpongeBob - Apr-17-2019

A three relay system as defined in my original post.


RE: New to Python and oop - Yoriz - Apr-17-2019

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.


RE: New to Python and oop - SpongeBob - Apr-17-2019

Understood. Thank you again for your assistance.


RE: New to Python and oop - buran - Apr-18-2019

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 >>>



RE: New to Python and oop - SpongeBob - Apr-28-2019

Thank you Buran!