Hướng dẫn do python objects have a value? - các đối tượng python có giá trị không?

Lưu ý rằng không phải tất cả các đối tượng đều có thuộc tính __dict__ và hơn nữa, đôi khi gọi dict(a) trong đó đối tượng a thực sự có thể được hiểu là từ điển sẽ dẫn đến việc chuyển đổi hợp lý a sang từ điển python bản địa. Ví dụ, với các mảng Numpy:

In [41]: a = np.array([[1, 2], [3, 4]])

In [42]: dict(a)
Out[42]: {1: 2, 3: 4}

Nhưng a không có thuộc tính

In [43]: hasattr(a, '__dict__')
Out[43]: False

In [44]: hasattr(a, 'sum')
Out[44]: True

In [45]: getattr(a, 'sum')
Out[45]: 
0 có giá trị là
In [43]: hasattr(a, '__dict__')
Out[43]: False

In [44]: hasattr(a, 'sum')
Out[44]: True

In [45]: getattr(a, 'sum')
Out[45]: 
1. Thay vào đó, bạn có thể sử dụng
In [43]: hasattr(a, '__dict__')
Out[43]: False

In [44]: hasattr(a, 'sum')
Out[44]: True

In [45]: getattr(a, 'sum')
Out[45]: 
2 và
In [43]: hasattr(a, '__dict__')
Out[43]: False

In [44]: hasattr(a, 'sum')
Out[44]: True

In [45]: getattr(a, 'sum')
Out[45]: 
3 để kiểm tra linh hoạt các thuộc tính của đối tượng:

In [43]: hasattr(a, '__dict__')
Out[43]: False

In [44]: hasattr(a, 'sum')
Out[44]: True

In [45]: getattr(a, 'sum')
Out[45]: 

Vì vậy, a không có __dict__ như một thuộc tính, nhưng nó có

In [43]: hasattr(a, '__dict__')
Out[43]: False

In [44]: hasattr(a, 'sum')
Out[44]: True

In [45]: getattr(a, 'sum')
Out[45]: 
6 như một thuộc tính và
In [43]: hasattr(a, '__dict__')
Out[43]: False

In [44]: hasattr(a, 'sum')
Out[44]: True

In [45]: getattr(a, 'sum')
Out[45]: 
7 là
In [43]: hasattr(a, '__dict__')
Out[43]: False

In [44]: hasattr(a, 'sum')
Out[44]: True

In [45]: getattr(a, 'sum')
Out[45]: 
8.

Nếu bạn muốn xem tất cả các thuộc tính mà a có, bạn có thể sử dụng

In [47]: dir(a)[:5]
Out[47]: ['T', '__abs__', '__add__', '__and__', '__array__']
0:

In [47]: dir(a)[:5]
Out[47]: ['T', '__abs__', '__add__', '__and__', '__array__']

(Tôi chỉ hiển thị 5 thuộc tính đầu tiên vì các mảng Numpy có rất nhiều.)

Hướng dẫn về người mới bắt đầu Python

Tìm hiểu về so sánh danh tính so với so sánh bình đẳng In [47]: dir(a)[:5] Out[47]: ['T', '__abs__', '__add__', '__and__', '__array__'] 1

Ảnh của Magda Ehlers từ Pexels

Đối tượng trong Python

Các đối tượng là sự trừu tượng của Python cho dữ liệu. Tất cả dữ liệu trong chương trình Python được biểu thị bằng các đối tượng hoặc bằng mối quan hệ giữa các đối tượng.-Python Docs

Trong Python, mọi đối tượng được tạo ra đều được đưa ra một số xác định duy nhất nó. Người ta đảm bảo rằng không có hai đối tượng nào sẽ có cùng một định danh trong bất kỳ khoảng thời gian nào trong đó tuổi thọ của chúng chồng chéo. Khi số lượng tham chiếu của một đối tượng giảm xuống 0 và nó được thu thập rác, thì số nhận dạng của nó sẽ có sẵn và có thể được sử dụng lại.identifier during any period in which their lifetimes overlap. Once an object’s reference count drops to zero and it is garbage collected, then its identifying number becomes available and may be used again.

Hàm Python tích hợp

In [47]: dir(a)[:5]
Out[47]: ['T', '__abs__', '__add__', '__and__', '__array__']
2 trả về một định danh số nguyên của đối tượng. Sử dụng hàm
In [47]: dir(a)[:5]
Out[47]: ['T', '__abs__', '__add__', '__and__', '__array__']
2, bạn có thể xác minh rằng hai biến thực sự trỏ đến cùng một đối tượng.
In [47]: dir(a)[:5]
Out[47]: ['T', '__abs__', '__add__', '__and__', '__array__']
2
returns an object’s integer identifier. Using the
In [47]: dir(a)[:5]
Out[47]: ['T', '__abs__', '__add__', '__and__', '__array__']
2 function, you can verify that two variables indeed point to the same object.

Một đối tượng giá trị là một trong những khối xây dựng cơ bản của thiết kế dựa trên tên miền. Nó là một đối tượng nhỏ (về bộ nhớ), bao gồm một hoặc nhiều thuộc tính và đại diện cho một tổng thể khái niệm. Đối tượng giá trị thường là một phần của thực thể.Value Object is one of the fundamental building blocks of Domain-Driven Design. It is a small object (in terms of memory), which consists of one or more attributes, and which represents a conceptual whole. Value Object is usually a part of Entity.

Một số ví dụ về các đối tượng giá trị là:

In [47]: dir(a)[:5]
Out[47]: ['T', '__abs__', '__add__', '__and__', '__array__']
4 (bao gồm một thuộc tính email duy nhất),
In [47]: dir(a)[:5]
Out[47]: ['T', '__abs__', '__add__', '__and__', '__array__']
5 (bao gồm số lượng và tiền tệ),
In [47]: dir(a)[:5]
Out[47]: ['T', '__abs__', '__add__', '__and__', '__array__']
6 (bao gồm ngày bắt đầu và ngày kết thúc), ____27 (được làm bằng vĩ độ và kinh độ), hoặc
In [47]: dir(a)[:5]
Out[47]: ['T', '__abs__', '__add__', '__and__', '__array__']
8 (bao gồm một đường phố, mã zip, thành phố, tiểu bang, v.v.). Ngoài các thuộc tính, tất cả những điều trên có thể (và nên) bao gồm một số loại logic xác thực.

Như bạn có thể thấy từ các ví dụ trên, các đối tượng giá trị không có danh tính - chúng chỉ đơn giản là một tập hợp các thuộc tính có liên quan với nhau.

Dưới đây là các thuộc tính quan trọng nhất của một đối tượng giá trị:

  1. Nhà nước của nó là bất biến. Sau khi được tạo, trạng thái của một đối tượng giá trị không thể được thay đổi.
  2. Nó chỉ có thể phân biệt bằng trạng thái của các thuộc tính của nó. Hai trường hợp có cùng giá trị thuộc tính được coi là bằng nhau (điều này còn được gọi là bình đẳng cấu trúc).
  3. Nó sẽ gói gọn logic kinh doanh ngăn chúng ta xây dựng một đối tượng giá trị với trạng thái không hợp lệ (nghĩa là ngày bắt đầu
  4. Tất cả các phương thức của một đối tượng giá trị phải là tinh khiết, tức là gọi một phương thức không kích hoạt bất kỳ tác dụng phụ nào hoặc thay đổi trạng thái của đối tượng giá trị. Tuy nhiên, trả lại một thể hiện mới phản ánh các thay đổi là tốt.
  5. Nó sẽ dễ dàng kiểm tra đơn vị một đối tượng giá trị và nó sẽ dễ dàng lý luận về logic của nó.

Để nhận ra một đối tượng giá trị trong mô hình miền của bạn, thay thế tinh thần bằng một bộ xử lý bằng một số logic xác thực và một vài phương pháp bổ sung dễ kiểm tra.

Hãy thực hiện đối tượng giá trị

In [47]: dir(a)[:5]
Out[47]: ['T', '__abs__', '__add__', '__and__', '__array__']
6 bằng mô -đun Python
from dataclasses import dataclass
from datetime import date

class BusinessRuleValidationException(Exception):
  """A base class for all business rule validation exceptions"""

class ValueObject:
  """A base class for all value objects"""

@dataclass(frozen=True)
class DateRange(ValueObject):
  """Our first value object"""
  start_date: date
  end_date: date

  def __post_init__(self):
    """Here we check if a value object has a valid state."""
    if not self.start_date < self.end_date
      raise BusinessRuleValidationException("end date date should be greater than start date")

  def days(self):
    """Returns the number of days between the start date and the end date"""
    delta = self.end_date - self.start_date + timedelta(days=1)
    return delta.days

  def extend(self, days):
    """Extend the end date by a specified number of days"""
    new_end_date = self.end_date + timedelta(days=days)
    return DateRange(self.start_date, new_end_date)
0:

from dataclasses import dataclass
from datetime import date

class BusinessRuleValidationException(Exception):
  """A base class for all business rule validation exceptions"""

class ValueObject:
  """A base class for all value objects"""

@dataclass(frozen=True)
class DateRange(ValueObject):
  """Our first value object"""
  start_date: date
  end_date: date

  def __post_init__(self):
    """Here we check if a value object has a valid state."""
    if not self.start_date < self.end_date
      raise BusinessRuleValidationException("end date date should be greater than start date")

  def days(self):
    """Returns the number of days between the start date and the end date"""
    delta = self.end_date - self.start_date + timedelta(days=1)
    return delta.days

  def extend(self, days):
    """Extend the end date by a specified number of days"""
    new_end_date = self.end_date + timedelta(days=days)
    return DateRange(self.start_date, new_end_date)

Re 1: Để đảm bảo tính bất biến của

In [47]: dir(a)[:5]
Out[47]: ['T', '__abs__', '__add__', '__and__', '__array__']
6, chúng tôi đang sử dụng
from dataclasses import dataclass
from datetime import date

class BusinessRuleValidationException(Exception):
  """A base class for all business rule validation exceptions"""

class ValueObject:
  """A base class for all value objects"""

@dataclass(frozen=True)
class DateRange(ValueObject):
  """Our first value object"""
  start_date: date
  end_date: date

  def __post_init__(self):
    """Here we check if a value object has a valid state."""
    if not self.start_date < self.end_date
      raise BusinessRuleValidationException("end date date should be greater than start date")

  def days(self):
    """Returns the number of days between the start date and the end date"""
    delta = self.end_date - self.start_date + timedelta(days=1)
    return delta.days

  def extend(self, days):
    """Extend the end date by a specified number of days"""
    new_end_date = self.end_date + timedelta(days=days)
    return DateRange(self.start_date, new_end_date)
2.
: To guarantee immutability of a
In [47]: dir(a)[:5]
Out[47]: ['T', '__abs__', '__add__', '__and__', '__array__']
6, we are using
from dataclasses import dataclass
from datetime import date

class BusinessRuleValidationException(Exception):
  """A base class for all business rule validation exceptions"""

class ValueObject:
  """A base class for all value objects"""

@dataclass(frozen=True)
class DateRange(ValueObject):
  """Our first value object"""
  start_date: date
  end_date: date

  def __post_init__(self):
    """Here we check if a value object has a valid state."""
    if not self.start_date < self.end_date
      raise BusinessRuleValidationException("end date date should be greater than start date")

  def days(self):
    """Returns the number of days between the start date and the end date"""
    delta = self.end_date - self.start_date + timedelta(days=1)
    return delta.days

  def extend(self, days):
    """Extend the end date by a specified number of days"""
    new_end_date = self.end_date + timedelta(days=days)
    return DateRange(self.start_date, new_end_date)
2 decorator.

Re 2: Bình đẳng được đảm bảo bởi chính

from dataclasses import dataclass
from datetime import date

class BusinessRuleValidationException(Exception):
  """A base class for all business rule validation exceptions"""

class ValueObject:
  """A base class for all value objects"""

@dataclass(frozen=True)
class DateRange(ValueObject):
  """Our first value object"""
  start_date: date
  end_date: date

  def __post_init__(self):
    """Here we check if a value object has a valid state."""
    if not self.start_date < self.end_date
      raise BusinessRuleValidationException("end date date should be greater than start date")

  def days(self):
    """Returns the number of days between the start date and the end date"""
    delta = self.end_date - self.start_date + timedelta(days=1)
    return delta.days

  def extend(self, days):
    """Extend the end date by a specified number of days"""
    new_end_date = self.end_date + timedelta(days=days)
    return DateRange(self.start_date, new_end_date)
3, so sánh thể hiện của lớp như thể nó là một tuple của các trường của nó.: Equality is guaranteed by a
from dataclasses import dataclass
from datetime import date

class BusinessRuleValidationException(Exception):
  """A base class for all business rule validation exceptions"""

class ValueObject:
  """A base class for all value objects"""

@dataclass(frozen=True)
class DateRange(ValueObject):
  """Our first value object"""
  start_date: date
  end_date: date

  def __post_init__(self):
    """Here we check if a value object has a valid state."""
    if not self.start_date < self.end_date
      raise BusinessRuleValidationException("end date date should be greater than start date")

  def days(self):
    """Returns the number of days between the start date and the end date"""
    delta = self.end_date - self.start_date + timedelta(days=1)
    return delta.days

  def extend(self, days):
    """Extend the end date by a specified number of days"""
    new_end_date = self.end_date + timedelta(days=days)
    return DateRange(self.start_date, new_end_date)
3 itself, which compares the class instance as if it were a tuple of its fields.

Re 3: Chúng tôi xác nhận trạng thái của một thể hiện trong phương thức

from dataclasses import dataclass
from datetime import date

class BusinessRuleValidationException(Exception):
  """A base class for all business rule validation exceptions"""

class ValueObject:
  """A base class for all value objects"""

@dataclass(frozen=True)
class DateRange(ValueObject):
  """Our first value object"""
  start_date: date
  end_date: date

  def __post_init__(self):
    """Here we check if a value object has a valid state."""
    if not self.start_date < self.end_date
      raise BusinessRuleValidationException("end date date should be greater than start date")

  def days(self):
    """Returns the number of days between the start date and the end date"""
    delta = self.end_date - self.start_date + timedelta(days=1)
    return delta.days

  def extend(self, days):
    """Extend the end date by a specified number of days"""
    new_end_date = self.end_date + timedelta(days=days)
    return DateRange(self.start_date, new_end_date)
4 bằng cách sử dụng logic đơn giản để kiểm tra các bất biến. Nó ngăn chúng ta tạo ra một phạm vi ngày không hợp lệ.: We validate the state of an instance in
from dataclasses import dataclass
from datetime import date

class BusinessRuleValidationException(Exception):
  """A base class for all business rule validation exceptions"""

class ValueObject:
  """A base class for all value objects"""

@dataclass(frozen=True)
class DateRange(ValueObject):
  """Our first value object"""
  start_date: date
  end_date: date

  def __post_init__(self):
    """Here we check if a value object has a valid state."""
    if not self.start_date < self.end_date
      raise BusinessRuleValidationException("end date date should be greater than start date")

  def days(self):
    """Returns the number of days between the start date and the end date"""
    delta = self.end_date - self.start_date + timedelta(days=1)
    return delta.days

  def extend(self, days):
    """Extend the end date by a specified number of days"""
    new_end_date = self.end_date + timedelta(days=days)
    return DateRange(self.start_date, new_end_date)
4 method using simple logic to check invariants. It prevents us from creating an invalid date range.

Re 4: Đối tượng giá trị của chúng tôi chỉ có 2 phương pháp:

from dataclasses import dataclass
from datetime import date

class BusinessRuleValidationException(Exception):
  """A base class for all business rule validation exceptions"""

class ValueObject:
  """A base class for all value objects"""

@dataclass(frozen=True)
class DateRange(ValueObject):
  """Our first value object"""
  start_date: date
  end_date: date

  def __post_init__(self):
    """Here we check if a value object has a valid state."""
    if not self.start_date < self.end_date
      raise BusinessRuleValidationException("end date date should be greater than start date")

  def days(self):
    """Returns the number of days between the start date and the end date"""
    delta = self.end_date - self.start_date + timedelta(days=1)
    return delta.days

  def extend(self, days):
    """Extend the end date by a specified number of days"""
    new_end_date = self.end_date + timedelta(days=days)
    return DateRange(self.start_date, new_end_date)
5 và
from dataclasses import dataclass
from datetime import date

class BusinessRuleValidationException(Exception):
  """A base class for all business rule validation exceptions"""

class ValueObject:
  """A base class for all value objects"""

@dataclass(frozen=True)
class DateRange(ValueObject):
  """Our first value object"""
  start_date: date
  end_date: date

  def __post_init__(self):
    """Here we check if a value object has a valid state."""
    if not self.start_date < self.end_date
      raise BusinessRuleValidationException("end date date should be greater than start date")

  def days(self):
    """Returns the number of days between the start date and the end date"""
    delta = self.end_date - self.start_date + timedelta(days=1)
    return delta.days

  def extend(self, days):
    """Extend the end date by a specified number of days"""
    new_end_date = self.end_date + timedelta(days=days)
    return DateRange(self.start_date, new_end_date)
6. Cả hai đều thuần khiết (chúng là tác dụng phụ miễn phí). Lưu ý rằng
from dataclasses import dataclass
from datetime import date

class BusinessRuleValidationException(Exception):
  """A base class for all business rule validation exceptions"""

class ValueObject:
  """A base class for all value objects"""

@dataclass(frozen=True)
class DateRange(ValueObject):
  """Our first value object"""
  start_date: date
  end_date: date

  def __post_init__(self):
    """Here we check if a value object has a valid state."""
    if not self.start_date < self.end_date
      raise BusinessRuleValidationException("end date date should be greater than start date")

  def days(self):
    """Returns the number of days between the start date and the end date"""
    delta = self.end_date - self.start_date + timedelta(days=1)
    return delta.days

  def extend(self, days):
    """Extend the end date by a specified number of days"""
    new_end_date = self.end_date + timedelta(days=days)
    return DateRange(self.start_date, new_end_date)
6 trả về một thể hiện mới là
from dataclasses import dataclass
from datetime import date

class BusinessRuleValidationException(Exception):
  """A base class for all business rule validation exceptions"""

class ValueObject:
  """A base class for all value objects"""

@dataclass(frozen=True)
class DateRange(ValueObject):
  """Our first value object"""
  start_date: date
  end_date: date

  def __post_init__(self):
    """Here we check if a value object has a valid state."""
    if not self.start_date < self.end_date
      raise BusinessRuleValidationException("end date date should be greater than start date")

  def days(self):
    """Returns the number of days between the start date and the end date"""
    delta = self.end_date - self.start_date + timedelta(days=1)
    return delta.days

  def extend(self, days):
    """Extend the end date by a specified number of days"""
    new_end_date = self.end_date + timedelta(days=days)
    return DateRange(self.start_date, new_end_date)
8 thay vì sửa đổi thuộc tính
from dataclasses import dataclass
from datetime import date

class BusinessRuleValidationException(Exception):
  """A base class for all business rule validation exceptions"""

class ValueObject:
  """A base class for all value objects"""

@dataclass(frozen=True)
class DateRange(ValueObject):
  """Our first value object"""
  start_date: date
  end_date: date

  def __post_init__(self):
    """Here we check if a value object has a valid state."""
    if not self.start_date < self.end_date
      raise BusinessRuleValidationException("end date date should be greater than start date")

  def days(self):
    """Returns the number of days between the start date and the end date"""
    delta = self.end_date - self.start_date + timedelta(days=1)
    return delta.days

  def extend(self, days):
    """Extend the end date by a specified number of days"""
    new_end_date = self.end_date + timedelta(days=days)
    return DateRange(self.start_date, new_end_date)
9.
: Our value object has only 2 methods:
from dataclasses import dataclass
from datetime import date

class BusinessRuleValidationException(Exception):
  """A base class for all business rule validation exceptions"""

class ValueObject:
  """A base class for all value objects"""

@dataclass(frozen=True)
class DateRange(ValueObject):
  """Our first value object"""
  start_date: date
  end_date: date

  def __post_init__(self):
    """Here we check if a value object has a valid state."""
    if not self.start_date < self.end_date
      raise BusinessRuleValidationException("end date date should be greater than start date")

  def days(self):
    """Returns the number of days between the start date and the end date"""
    delta = self.end_date - self.start_date + timedelta(days=1)
    return delta.days

  def extend(self, days):
    """Extend the end date by a specified number of days"""
    new_end_date = self.end_date + timedelta(days=days)
    return DateRange(self.start_date, new_end_date)
5 and
from dataclasses import dataclass
from datetime import date

class BusinessRuleValidationException(Exception):
  """A base class for all business rule validation exceptions"""

class ValueObject:
  """A base class for all value objects"""

@dataclass(frozen=True)
class DateRange(ValueObject):
  """Our first value object"""
  start_date: date
  end_date: date

  def __post_init__(self):
    """Here we check if a value object has a valid state."""
    if not self.start_date < self.end_date
      raise BusinessRuleValidationException("end date date should be greater than start date")

  def days(self):
    """Returns the number of days between the start date and the end date"""
    delta = self.end_date - self.start_date + timedelta(days=1)
    return delta.days

  def extend(self, days):
    """Extend the end date by a specified number of days"""
    new_end_date = self.end_date + timedelta(days=days)
    return DateRange(self.start_date, new_end_date)
6. Both of them are pure (they are side effects free). Note that
from dataclasses import dataclass
from datetime import date

class BusinessRuleValidationException(Exception):
  """A base class for all business rule validation exceptions"""

class ValueObject:
  """A base class for all value objects"""

@dataclass(frozen=True)
class DateRange(ValueObject):
  """Our first value object"""
  start_date: date
  end_date: date

  def __post_init__(self):
    """Here we check if a value object has a valid state."""
    if not self.start_date < self.end_date
      raise BusinessRuleValidationException("end date date should be greater than start date")

  def days(self):
    """Returns the number of days between the start date and the end date"""
    delta = self.end_date - self.start_date + timedelta(days=1)
    return delta.days

  def extend(self, days):
    """Extend the end date by a specified number of days"""
    new_end_date = self.end_date + timedelta(days=days)
    return DateRange(self.start_date, new_end_date)
6 returns a new instance of
from dataclasses import dataclass
from datetime import date

class BusinessRuleValidationException(Exception):
  """A base class for all business rule validation exceptions"""

class ValueObject:
  """A base class for all value objects"""

@dataclass(frozen=True)
class DateRange(ValueObject):
  """Our first value object"""
  start_date: date
  end_date: date

  def __post_init__(self):
    """Here we check if a value object has a valid state."""
    if not self.start_date < self.end_date
      raise BusinessRuleValidationException("end date date should be greater than start date")

  def days(self):
    """Returns the number of days between the start date and the end date"""
    delta = self.end_date - self.start_date + timedelta(days=1)
    return delta.days

  def extend(self, days):
    """Extend the end date by a specified number of days"""
    new_end_date = self.end_date + timedelta(days=days)
    return DateRange(self.start_date, new_end_date)
8 instead of modifying the
from dataclasses import dataclass
from datetime import date

class BusinessRuleValidationException(Exception):
  """A base class for all business rule validation exceptions"""

class ValueObject:
  """A base class for all value objects"""

@dataclass(frozen=True)
class DateRange(ValueObject):
  """Our first value object"""
  start_date: date
  end_date: date

  def __post_init__(self):
    """Here we check if a value object has a valid state."""
    if not self.start_date < self.end_date
      raise BusinessRuleValidationException("end date date should be greater than start date")

  def days(self):
    """Returns the number of days between the start date and the end date"""
    delta = self.end_date - self.start_date + timedelta(days=1)
    return delta.days

  def extend(self, days):
    """Extend the end date by a specified number of days"""
    new_end_date = self.end_date + timedelta(days=days)
    return DateRange(self.start_date, new_end_date)
9 attribute.

Re 5: Nhờ hành vi đơn giản của nó, kiểm tra đơn vị

from dataclasses import dataclass
from datetime import date

class BusinessRuleValidationException(Exception):
  """A base class for all business rule validation exceptions"""

class ValueObject:
  """A base class for all value objects"""

@dataclass(frozen=True)
class DateRange(ValueObject):
  """Our first value object"""
  start_date: date
  end_date: date

  def __post_init__(self):
    """Here we check if a value object has a valid state."""
    if not self.start_date < self.end_date
      raise BusinessRuleValidationException("end date date should be greater than start date")

  def days(self):
    """Returns the number of days between the start date and the end date"""
    delta = self.end_date - self.start_date + timedelta(days=1)
    return delta.days

  def extend(self, days):
    """Extend the end date by a specified number of days"""
    new_end_date = self.end_date + timedelta(days=days)
    return DateRange(self.start_date, new_end_date)
8 cũng tương đối đơn giản:: Thanks to its simple behavior, unit testing
from dataclasses import dataclass
from datetime import date

class BusinessRuleValidationException(Exception):
  """A base class for all business rule validation exceptions"""

class ValueObject:
  """A base class for all value objects"""

@dataclass(frozen=True)
class DateRange(ValueObject):
  """Our first value object"""
  start_date: date
  end_date: date

  def __post_init__(self):
    """Here we check if a value object has a valid state."""
    if not self.start_date < self.end_date
      raise BusinessRuleValidationException("end date date should be greater than start date")

  def days(self):
    """Returns the number of days between the start date and the end date"""
    delta = self.end_date - self.start_date + timedelta(days=1)
    return delta.days

  def extend(self, days):
    """Extend the end date by a specified number of days"""
    new_end_date = self.end_date + timedelta(days=days)
    return DateRange(self.start_date, new_end_date)
8 is also relatively straightforward:

import unittest

class DateRangeTestCase(unittest.TestCase):
    def test_equality(self):
        range1 = DateRange(start_date=date(2020,1,1), end_date=date(2021,1,1))
        range2 = DateRange(start_date=date(2020,1,1), end_date=date(2021,1,1))
        self.assertEqual(range1, range2)

    def test_days(self):
        range = DateRange(start_date=date(2020,1,1), end_date=date(2020,1,1))
        self.assertEqual(range.days(), 1)

    def test_days(self):
        range1 = DateRange(start_date=date(2020,1,1), end_date=date(2020,1,1))
        range2 = range1.extend(days=1)
        self.assertEqual(
            range2, 
            DateRange(start_date=date(2020,1,1), end_date=date(2021,1,2))
        )

    def test_cannot_create_invalid_date_range(self):
        with self.assertRaises(BusinessRuleValidationException):
            DateRange(start_date=date(2021,1,1), end_date=date(2020,1,1))

Sử dụng các đối tượng giá trị trong mã của bạn cũng sẽ giúp bạn chiến đấu với nỗi ám ảnh nguyên thủy. Tại sao nó lại quan trọng? Hãy để tôi cho bạn một ví dụ để minh họa vấn đề. Hãy nói rằng bạn quyết định cắt góc và sử dụng

import unittest

class DateRangeTestCase(unittest.TestCase):
    def test_equality(self):
        range1 = DateRange(start_date=date(2020,1,1), end_date=date(2021,1,1))
        range2 = DateRange(start_date=date(2020,1,1), end_date=date(2021,1,1))
        self.assertEqual(range1, range2)

    def test_days(self):
        range = DateRange(start_date=date(2020,1,1), end_date=date(2020,1,1))
        self.assertEqual(range.days(), 1)

    def test_days(self):
        range1 = DateRange(start_date=date(2020,1,1), end_date=date(2020,1,1))
        range2 = range1.extend(days=1)
        self.assertEqual(
            range2, 
            DateRange(start_date=date(2020,1,1), end_date=date(2021,1,2))
        )

    def test_cannot_create_invalid_date_range(self):
        with self.assertRaises(BusinessRuleValidationException):
            DateRange(start_date=date(2021,1,1), end_date=date(2020,1,1))
1 để đại diện cho email. Có một cơ hội cao là bạn cũng sẽ cần xác thực các email đó và rất có thể bạn sẽ cần phải làm ở nhiều nơi (nghĩa là đầu vào người dùng, dữ liệu hình thành, serializer, logic kinh doanh, v.v.). Có một đối tượng giá trị
In [47]: dir(a)[:5]
Out[47]: ['T', '__abs__', '__add__', '__and__', '__array__']
4 đơn giản sẽ giúp bạn khô ráo trong thời gian dài.

Giá trị của một đối tượng trong Python là gì?

Một đối tượng giá trị là một trong những khối xây dựng cơ bản của thiết kế dựa trên tên miền. Nó là một đối tượng nhỏ (về bộ nhớ), bao gồm một hoặc nhiều thuộc tính và đại diện cho một tổng thể khái niệm. Đối tượng giá trị thường là một phần của thực thể.a small object (in terms of memory), which consists of one or more attributes, and which represents a conceptual whole. Value Object is usually a part of Entity.

Có phải tất cả các giá trị trong các đối tượng Python?

Tất cả các loại dữ liệu, chẳng hạn như số, chuỗi, danh sách và từ điển, đều là đối tượng trong Python.Sử dụng một ví dụ hữu hình, bạn có thể nghĩ về chúng như các hộp dữ liệu.. Using a tangible example, you can think about them physically as boxes of data.

Một đối tượng có thể là một giá trị?

Ví dụ về các đối tượng giá trị là các đối tượng đại diện cho một số tiền hoặc phạm vi ngày.Là nhỏ, người ta có thể có nhiều bản sao của cùng một đối tượng giá trị đại diện cho cùng một thực thể: thường đơn giản hơn để tạo một đối tượng mới thay vì dựa vào một trường hợp duy nhất và sử dụng các tham chiếu cho nó.. Being small, one can have multiple copies of the same value object that represent the same entity: it is often simpler to create a new object rather than rely on a single instance and use references to it.

Là giá trị và đối tượng giống nhau trong Python?

Cho đến bây giờ, chúng tôi đã sử dụng đối tượng của người Viking và giá trị có thể thay thế cho nhau, nhưng chính xác hơn khi nói rằng một đối tượng có giá trị.Nếu bạn thực thi A = [1,2,3], một đề cập đến một đối tượng danh sách có giá trị là một chuỗi các phần tử cụ thể.Nếu một danh sách khác có cùng yếu tố, chúng tôi sẽ nói nó có cùng giá trị.an object has a value. If you execute a = [1,2,3] , a refers to a list object whose value is a particular sequence of elements. If another list has the same elements, we would say it has the same value.