# Code introspection is the ability to examine classes, functions and keywords
# to know what they are, what they do and what they know.

# Python provides several functions and utilities for code introspection.
"""
help()
dir()
hasattr()
id()
type()
repr()
callable()
issubclass()
isinstance()
__doc__
__name__
"""

# Often the most important one is the help function, since you can use it to find what other functions do.

# EXERCISE
# Print a list of all attributes of the given Vehicle object.
# -----
# Define the Vehicle class
class Vehicle:
    name = ""
    kind = "car"
    color = ""
    value = 100.00
    def description(self):
        desc_str = "%s is a %s %s worth $%.2f." % (self.name, self.color, self.kind, self.value)
        return desc_str

# Print a list of all attributes of the Vehicle class.
print(dir(Vehicle))
# -----
# Output:
"""
 ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', 
 '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', 
 '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', 
 '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 
 'color', 'description', 'kind', 'name', 'value']
"""
