Prevent external edits to properties
Any attribute can be changed when you have a class instance. But you can follow convention that attributes started from single and double underscore is private and you should not access them directly unless you know what are you doing.
To provide public interface @property decorator really what you want.
Enforce certain constraints
Quote from docs:
In the current implementation, the built-in variable __debug__ is True under normal circumstances, False when optimization is requested (command line option -O). The current code generator emits no code for an assert statement when optimization is requested at compile time.
Assets is for development only. They can be used for test checking, etc. In case you need to check appropriate values are passed into __init__ method, you can raise ValueError or custom error derived from it.
class Card(object):
    class CardValueError(ValueError):
        pass
    __ranks = ['Ace', '2', '3', '4', '5', '6', '7', '8', '9', '10',
               'Jack', 'Queen', 'King']
    __suits = ['Heart', 'Club', 'Diamond', 'Spade']
    def __init__(self, rank, suit):
        if rank not in self.__ranks or suit not in self.__suits:
            raise Card.CardValueError()
        self.__rank = rank
        self.__suit = suit
    @property
    def rank(self):
        return self.__rank
    @property
    def suit(self):
        return self.__suit