Instance Methods¶
Instance methods are functions that belong to class instances, operating on instance-specific data.
What are Instance Methods¶
1. Functions in Class¶
class Student:
def __init__(self, name, courses):
self.name = name
self.courses = courses
def add_course(self, course): # Instance method
self.courses.append(course)
2. Receive self¶
First parameter is always self.
3. Operate on Instance¶
Methods modify or access instance attributes.
The self Parameter¶
1. Reference to Instance¶
class Student:
def greet(self):
print(f"Hello, I'm {self.name}")
a = Student("Lee")
a.greet() # self = a
2. Automatic Passing¶
# These are equivalent:
a.greet()
Student.greet(a)
3. Access Instance Data¶
def get_info(self):
return f"{self.name}, {self.major}"
Defining Methods¶
1. Basic Method¶
class Student:
def __init__(self, name, courses):
self.name = name
self.courses = courses
def add_course(self, course):
if course not in self.courses:
self.courses.append(course)
2. Multiple Parameters¶
def enroll(self, course, semester):
enrollment = {
'course': course,
'semester': semester
}
self.enrollments.append(enrollment)
3. Return Values¶
def has_course(self, course):
return course in self.courses
Method Examples¶
1. Getter Method¶
class Student:
def __init__(self, name):
self.name = name
def get_name(self):
return self.name
2. Setter Method¶
def set_name(self, name):
if name:
self.name = name
3. Action Method¶
def drop_course(self, course):
if course in self.courses:
self.courses.remove(course)
Calling Methods¶
1. Via Instance¶
student = Student("Lee", ["Math"])
student.add_course("Physics")
2. Via Class¶
Student.add_course(student, "Physics")
# Equivalent but not idiomatic
3. Chaining Methods¶
class Counter:
def __init__(self):
self.count = 0
def increment(self):
self.count += 1
return self # Return self for chaining
def reset(self):
self.count = 0
return self
c = Counter().increment().increment().reset()
self Mechanics¶
1. Must Use self¶
# WRONG
def add_course(self, course):
courses.append(course) # NameError!
# CORRECT
def add_course(self, course):
self.courses.append(course)
2. Access Attributes¶
def print_info(self):
print(f"Name: {self.name}")
print(f"Major: {self.major}")
3. Call Other Methods¶
def enroll_and_notify(self, course):
self.add_course(course)
self.send_notification()
Instance vs Class Variables¶
1. Accessing Instance Variable¶
class Student:
def __init__(self, name):
self.name = name # instance variable
def greet(self):
return f"Hello, {self.name}"
2. Accessing Class Variable¶
class Student:
university = 'Yonsei' # class variable
def get_university(self):
return Student.university # or self.university
3. Modifying Class Variable¶
def change_university(self, new_name):
self.university = new_name # WRONG - creates instance attr
@classmethod
def change_university(cls, new_name):
cls.university = new_name # CORRECT
Method vs Function¶
1. Function Attribute¶
def f():
return 1
print(f) # <function f>
print(f()) # 1
2. Method Attribute¶
import numpy as np
x = np.array([1, 2, 3])
print(x.sum) # <built-in method sum>
print(x.sum()) # 6
3. Bound Methods¶
class Student:
def greet(self):
return "Hello"
a = Student()
print(Student.greet) # <function greet>
print(a.greet) # <bound method greet>
Common Patterns¶
1. Validation¶
def set_age(self, age):
if 0 <= age <= 120:
self.age = age
else:
raise ValueError("Invalid age")
2. Computation¶
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
3. State Change¶
class Car:
def __init__(self, speed):
self.speed = speed
def accelerate(self, amount):
self.speed += amount
Helper Methods¶
1. Private Methods¶
class Student:
def process(self):
self._validate()
self._compute()
def _validate(self): # "private" by convention
if not self.name:
raise ValueError("Name required")
def _compute(self):
pass
2. Public Interface¶
def enroll(self, course):
self._validate_prerequisites(course)
self._add_to_schedule(course)
self._update_credits()
3. Internal Logic¶
Keep complex logic in separate methods.
Method Signatures¶
1. No Parameters¶
def reset(self):
self.count = 0
2. With Parameters¶
def add(self, item, priority=0):
self.items.append((item, priority))
3. Variable Arguments¶
def add_multiple(self, *courses):
for course in courses:
self.add_course(course)
Key Takeaways¶
- Instance methods operate on instance data.
- First parameter is always
self. - Access instance attributes via
self. - Call methods via instance:
obj.method(). - Use
_methodfor internal helpers.