Hướng dẫn can you use structs in python? - bạn có thể sử dụng cấu trúc trong python không?

Đã hỏi 14 năm, 1 tháng trước 14 years, 1 month ago

Đã xem 768k lần 768k times

Có cách nào để xác định thuận tiện một cấu trúc giống như C trong Python không? Tôi mệt mỏi khi viết những thứ như:

class MyStruct():
    def __init__(self, field1, field2, field3):
        self.field1 = field1
        self.field2 = field2
        self.field3 = field3

Hướng dẫn can you use structs in python? - bạn có thể sử dụng cấu trúc trong python không?

Hỏi ngày 30 tháng 8 năm 2008 lúc 14:33Aug 30, 2008 at 14:33

10

Cập nhật: Các lớp dữ liệu

Với việc giới thiệu các lớp dữ liệu trong Python 3.7, chúng tôi sẽ rất gần.Python 3.7 we get very close.

Ví dụ sau đây tương tự như ví dụ được đặt tên bên dưới, nhưng đối tượng kết quả là có thể thay đổi và nó cho phép các giá trị mặc định.mutable and it allows for default values.

from dataclasses import dataclass


@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0


p = Point(1.5, 2.5)

print(p)  # Point(x=1.5, y=2.5, z=0.0)

Điều này chơi độc đáo với mô -đun gõ mới trong trường hợp bạn muốn sử dụng các chú thích loại cụ thể hơn.

Tôi đã chờ đợi một cách tuyệt vọng vì điều này! Nếu bạn hỏi tôi, các lớp dữ liệu và tuyên bố mới được đặt tên, kết hợp với mô -đun gõ là một ơn trời!

Cải thiện Tuyên bố có tên

Vì Python 3.6, nó trở nên khá đơn giản và đẹp đẽ (IMHO), miễn là bạn có thể sống với sự bất biến.Python 3.6 it became quite simple and beautiful (IMHO), as long as you can live with immutability.

Một cách mới để tuyên bố tên được giới thiệu, cũng cho phép chú thích loại:

from typing import NamedTuple


class User(NamedTuple):
    name: str


class MyStruct(NamedTuple):
    foo: str
    bar: int
    baz: list
    qux: User


my_item = MyStruct('foo', 0, ['baz'], User('peter'))

print(my_item) # MyStruct(foo='foo', bar=0, baz=['baz'], qux=User(name='peter'))

Đã trả lời ngày 31 tháng 7 năm 2017 lúc 22:54Jul 31, 2017 at 22:54

Hướng dẫn can you use structs in python? - bạn có thể sử dụng cấu trúc trong python không?

RotaretirotaretiRotareti

43.9K19 Huy hiệu vàng104 Huy hiệu bạc102 Huy hiệu đồng19 gold badges104 silver badges102 bronze badges

9

Sử dụng một tuple có tên, được thêm vào mô -đun bộ sưu tập trong thư viện tiêu chuẩn trong Python 2.6. Cũng có thể sử dụng công thức tuple của Raymond Hettinger nếu bạn cần hỗ trợ Python 2.4.

Thật tốt cho ví dụ cơ bản của bạn, nhưng cũng bao gồm một loạt các trường hợp cạnh mà bạn cũng có thể gặp phải sau này. Đoạn của bạn ở trên sẽ được viết là:

from collections import namedtuple
MyStruct = namedtuple("MyStruct", "field1 field2 field3")

Loại mới được tạo có thể được sử dụng như thế này:

m = MyStruct("foo", "bar", "baz")

Bạn cũng có thể sử dụng các đối số có tên:

m = MyStruct(field1="foo", field2="bar", field3="baz")

Đã trả lời ngày 30 tháng 8 năm 2008 lúc 15:18Aug 30, 2008 at 15:18

gz.gz.gz.

6.5611 Huy hiệu vàng22 Huy hiệu bạc34 Huy hiệu đồng1 gold badge22 silver badges34 bronze badges

8

Bạn có thể sử dụng một tuple cho rất nhiều thứ mà bạn sẽ sử dụng một cấu trúc trong C (ví dụ như tọa độ x, y hoặc màu RGB).

Đối với mọi thứ khác, bạn có thể sử dụng từ điển hoặc lớp tiện ích như thế này:

>>> class Bunch:
...     def __init__(self, **kwds):
...         self.__dict__.update(kwds)
...
>>> mystruct = Bunch(field1=value1, field2=value2)

Tôi nghĩ rằng cuộc thảo luận "dứt khoát" là ở đây, trong phiên bản được xuất bản của cuốn sách nấu ăn Python.

JFS

382K182 Huy hiệu vàng947 Huy hiệu bạc1618 Huy hiệu đồng182 gold badges947 silver badges1618 bronze badges

Đã trả lời ngày 30 tháng 8 năm 2008 lúc 14:38Aug 30, 2008 at 14:38

dF.dF.dF.

72.3K29 Huy hiệu vàng128 Huy hiệu bạc135 Huy hiệu đồng29 gold badges128 silver badges135 bronze badges

5

Có lẽ bạn đang tìm kiếm các cấu trúc mà không có nhà xây dựng:

class Sample:
  name = ''
  average = 0.0
  values = None # list cannot be initialized here!


s1 = Sample()
s1.name = "sample 1"
s1.values = []
s1.values.append(1)
s1.values.append(2)
s1.values.append(3)

s2 = Sample()
s2.name = "sample 2"
s2.values = []
s2.values.append(4)

for v in s1.values:   # prints 1,2,3 --> OK.
  print v
print "***"
for v in s2.values:   # prints 4 --> OK.
  print v

Đã trả lời ngày 21 tháng 9 năm 2010 lúc 15:15Sep 21, 2010 at 15:15

8

Làm thế nào về một từ điển?

Một cái gì đó như thế này:

myStruct = {'field1': 'some val', 'field2': 'some val'}

Sau đó, bạn có thể sử dụng điều này để thao túng các giá trị:

print myStruct['field1']
myStruct['field2'] = 'some other values'

Và các giá trị không phải là chuỗi. Họ có thể là khá nhiều đối tượng khác.

Đã trả lời ngày 30 tháng 8 năm 2008 lúc 14:35Aug 30, 2008 at 14:35

Mark Biekmark BiekMark Biek

Phù bằng vàng 143K5454 gold badges155 silver badges200 bronze badges

2

DF: Điều đó thật tuyệt ... Tôi không biết rằng tôi có thể truy cập các trường trong một lớp bằng cách sử dụng Dict.

Mark: Những tình huống mà tôi ước mình có điều này chính xác khi tôi muốn có một tuple nhưng không có gì "nặng" như một từ điển.

Bạn có thể truy cập các trường của một lớp bằng cách sử dụng từ điển vì các trường của một lớp, các phương thức và tất cả các thuộc tính của nó được lưu trữ bên trong bằng cách sử dụng các dicts (ít nhất là trong cpython).

... Điều này dẫn chúng tôi đến bình luận thứ hai của bạn. Tin rằng Python dicts là "nặng" là một khái niệm cực kỳ phi trăn. Và đọc những bình luận như vậy giết chết Zen Python của tôi. Điều đó không tốt.

Bạn thấy đấy, khi bạn khai báo một lớp, bạn thực sự đang tạo một trình bao bọc khá phức tạp xung quanh một từ điển - vì vậy, nếu có bất cứ điều gì, bạn sẽ thêm nhiều chi phí hơn so với sử dụng một từ điển đơn giản. Một chi phí mà nhân tiện, là vô nghĩa trong mọi trường hợp. Nếu bạn đang làm việc trên các ứng dụng quan trọng hiệu suất, hãy sử dụng C hoặc một cái gì đó.

Hướng dẫn can you use structs in python? - bạn có thể sử dụng cấu trúc trong python không?

Artofwarfare

Huy hiệu vàng 19.6K1717 gold badges130 silver badges188 bronze badges

Đã trả lời ngày 30 tháng 8 năm 2008 lúc 15:20Aug 30, 2008 at 15:20

Vicent Martivicent MartiVicent Marti

7.1036 Huy hiệu vàng30 Huy hiệu bạc33 Huy hiệu Đồng6 gold badges30 silver badges33 bronze badges

1

Tôi cũng muốn thêm một giải pháp sử dụng các vị trí:

from dataclasses import dataclass


@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0


p = Point(1.5, 2.5)

print(p)  # Point(x=1.5, y=2.5, z=0.0)
0

Chắc chắn kiểm tra tài liệu cho các vị trí nhưng một lời giải thích nhanh về các vị trí là đó là cách nói của Python: "Nếu bạn có thể khóa các thuộc tính này và chỉ các thuộc tính này vào lớp để bạn cam kết rằng bạn sẽ không thêm bất kỳ thuộc tính mới nào sau khi lớp được khởi tạo (vâng, bạn có thể thêm các thuộc tính mới vào một thể hiện lớp, xem ví dụ bên dưới) sau đó tôi sẽ loại bỏ phân bổ bộ nhớ lớn cho phép thêm các thuộc tính mới vào một thể hiện lớp và sử dụng những gì tôi cần cho các thuộc tính có rãnh này ".

Ví dụ về việc thêm các thuộc tính vào thể hiện lớp (do đó không sử dụng các khe):

from dataclasses import dataclass


@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0


p = Point(1.5, 2.5)

print(p)  # Point(x=1.5, y=2.5, z=0.0)
1

Đầu ra: 8

Ví dụ về việc cố gắng thêm các thuộc tính vào thể hiện lớp nơi các khe được sử dụng:

from dataclasses import dataclass


@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0


p = Point(1.5, 2.5)

print(p)  # Point(x=1.5, y=2.5, z=0.0)
2

Đầu ra: AttributionError: 'Point' Object không có thuộc tính 'z'

Điều này có thể hoạt động hiệu quả như một cấu trúc và sử dụng ít bộ nhớ hơn một lớp (như một cấu trúc, mặc dù tôi chưa nghiên cứu chính xác bao nhiêu). Nên sử dụng các vị trí nếu bạn sẽ tạo ra một lượng lớn các thể hiện của đối tượng và không cần thêm các thuộc tính. Một đối tượng điểm là một ví dụ tốt về điều này vì có khả năng người ta có thể khởi tạo nhiều điểm để mô tả một bộ dữ liệu.

Hướng dẫn can you use structs in python? - bạn có thể sử dụng cấu trúc trong python không?

Đã trả lời ngày 12 tháng 4 năm 2018 lúc 6:17Apr 12, 2018 at 6:17

Hướng dẫn can you use structs in python? - bạn có thể sử dụng cấu trúc trong python không?

Oamar Kanjioamar KanjiOamar Kanji

1.4645 huy hiệu vàng19 Huy hiệu bạc34 Huy hiệu đồng5 gold badges19 silver badges34 bronze badges

1

Bạn có thể phân lớp cấu trúc C có sẵn trong thư viện tiêu chuẩn. Mô -đun CTYPES cung cấp một lớp cấu trúc. Ví dụ từ các tài liệu:

from dataclasses import dataclass


@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0


p = Point(1.5, 2.5)

print(p)  # Point(x=1.5, y=2.5, z=0.0)
3

Đã trả lời ngày 25 tháng 6 năm 2015 lúc 23:50Jun 25, 2015 at 23:50

Hướng dẫn can you use structs in python? - bạn có thể sử dụng cấu trúc trong python không?

Ella Roseella RoseElla Rose

4967 Huy hiệu bạc15 Huy hiệu Đồng7 silver badges15 bronze badges

0

Bạn cũng có thể chuyển các tham số init cho các biến thể hiện theo vị trí

from dataclasses import dataclass


@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0


p = Point(1.5, 2.5)

print(p)  # Point(x=1.5, y=2.5, z=0.0)
4

Đã trả lời ngày 30 tháng 8 năm 2008 lúc 15:53Aug 30, 2008 at 15:53

PablogpablogPabloG

24.8K10 Huy hiệu vàng45 Huy hiệu bạc59 Huy hiệu đồng10 gold badges45 silver badges59 bronze badges

2

Bất cứ khi nào tôi cần một "đối tượng dữ liệu tức thì cũng hoạt động như một từ điển" (tôi không nghĩ về C Structs!), Tôi nghĩ về bản hack dễ thương này:

from dataclasses import dataclass


@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0


p = Point(1.5, 2.5)

print(p)  # Point(x=1.5, y=2.5, z=0.0)
5

Bây giờ bạn chỉ có thể nói:

from dataclasses import dataclass


@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0


p = Point(1.5, 2.5)

print(p)  # Point(x=1.5, y=2.5, z=0.0)
6

Hoàn toàn tiện dụng cho những lúc bạn cần một "túi dữ liệu không phải là một lớp" và khi được đặt tên là không thể hiểu được ...

Đã trả lời ngày 13 tháng 9 năm 2013 lúc 17:40Sep 13, 2013 at 17:40

PhlipphlipPhlip

5.5023 Huy hiệu vàng29 Huy hiệu bạc46 Huy hiệu Đồng3 gold badges29 silver badges46 bronze badges

1

Một số câu trả lời ở đây được xây dựng ồ ạt. Tùy chọn đơn giản nhất mà tôi đã tìm thấy là (từ: http://norvig.com/python-iaq.html):

from dataclasses import dataclass


@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0


p = Point(1.5, 2.5)

print(p)  # Point(x=1.5, y=2.5, z=0.0)
7

Initialising:

from dataclasses import dataclass


@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0


p = Point(1.5, 2.5)

print(p)  # Point(x=1.5, y=2.5, z=0.0)
8

Thêm thêm:

from dataclasses import dataclass


@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0


p = Point(1.5, 2.5)

print(p)  # Point(x=1.5, y=2.5, z=0.0)
9

EDIT: Xin lỗi không thấy ví dụ này đã xuống xa hơn. Sorry didn't see this example already further down.

Đã trả lời ngày 5 tháng 8 năm 2017 lúc 0:39Aug 5, 2017 at 0:39

w_jayw_jayw_jay

3055 Huy hiệu bạc12 Huy hiệu Đồng5 silver badges12 bronze badges

2

Bạn truy cập cấu trúc kiểu C trong Python theo cách sau.

from typing import NamedTuple


class User(NamedTuple):
    name: str


class MyStruct(NamedTuple):
    foo: str
    bar: int
    baz: list
    qux: User


my_item = MyStruct('foo', 0, ['baz'], User('peter'))

print(my_item) # MyStruct(foo='foo', bar=0, baz=['baz'], qux=User(name='peter'))
0

Nếu bạn chỉ muốn sử dụng đối tượng của cstruct

from typing import NamedTuple


class User(NamedTuple):
    name: str


class MyStruct(NamedTuple):
    foo: str
    bar: int
    baz: list
    qux: User


my_item = MyStruct('foo', 0, ['baz'], User('peter'))

print(my_item) # MyStruct(foo='foo', bar=0, baz=['baz'], qux=User(name='peter'))
1

Nếu bạn muốn tạo một mảng các đối tượng của cstruct

from typing import NamedTuple


class User(NamedTuple):
    name: str


class MyStruct(NamedTuple):
    foo: str
    bar: int
    baz: list
    qux: User


my_item = MyStruct('foo', 0, ['baz'], User('peter'))

print(my_item) # MyStruct(foo='foo', bar=0, baz=['baz'], qux=User(name='peter'))
2

Lưu ý: Thay vì tên 'cstruct', vui lòng sử dụng tên struct của bạn thay vì var_i, var_f, var_str, vui lòng xác định biến thành viên của cấu trúc của bạn.

Hướng dẫn can you use structs in python? - bạn có thể sử dụng cấu trúc trong python không?

Trevor Hickey

34,8K28 Huy hiệu vàng150 Huy hiệu bạc258 Huy hiệu Đồng28 gold badges150 silver badges258 bronze badges

Đã trả lời ngày 9 tháng 11 năm 2014 lúc 7:37Nov 9, 2014 at 7:37

Sujal shethsujal shethSujal Sheth

3744 Huy hiệu bạc10 Huy hiệu đồng4 silver badges10 bronze badges

1

Điều này có thể hơi muộn nhưng tôi đã đưa ra một giải pháp bằng cách sử dụng lớp meta Python (phiên bản trang trí bên dưới).

Khi

m = MyStruct(field1="foo", field2="bar", field3="baz")
3 được gọi trong thời gian chạy, nó sẽ lấy từng đối số và giá trị của chúng và gán chúng dưới dạng biến thể hiện cho lớp của bạn. Bằng cách này, bạn có thể tạo một lớp giống như cấu trúc mà không cần phải gán mọi giá trị theo cách thủ công.

Ví dụ của tôi không có kiểm tra lỗi để theo dõi dễ dàng hơn.

from typing import NamedTuple


class User(NamedTuple):
    name: str


class MyStruct(NamedTuple):
    foo: str
    bar: int
    baz: list
    qux: User


my_item = MyStruct('foo', 0, ['baz'], User('peter'))

print(my_item) # MyStruct(foo='foo', bar=0, baz=['baz'], qux=User(name='peter'))
3

Đây là hành động.

from typing import NamedTuple


class User(NamedTuple):
    name: str


class MyStruct(NamedTuple):
    foo: str
    bar: int
    baz: list
    qux: User


my_item = MyStruct('foo', 0, ['baz'], User('peter'))

print(my_item) # MyStruct(foo='foo', bar=0, baz=['baz'], qux=User(name='peter'))
4

Tôi đã đăng nó trên Reddit và /U /Matchu đã đăng một phiên bản trang trí sạch hơn. Tôi khuyến khích bạn sử dụng nó trừ khi bạn muốn mở rộng phiên bản Metaclass.

from typing import NamedTuple


class User(NamedTuple):
    name: str


class MyStruct(NamedTuple):
    foo: str
    bar: int
    baz: list
    qux: User


my_item = MyStruct('foo', 0, ['baz'], User('peter'))

print(my_item) # MyStruct(foo='foo', bar=0, baz=['baz'], qux=User(name='peter'))
5

Đã trả lời ngày 23 tháng 3 năm 2015 lúc 14:32Mar 23, 2015 at 14:32

user124757user124757user124757

792 huy hiệu bạc5 huy hiệu đồng2 silver badges5 bronze badges

2

Tôi đã viết một bộ trang trí mà bạn có thể sử dụng trên bất kỳ phương pháp nào để làm cho nó để tất cả các đối số được truyền vào hoặc bất kỳ mặc định nào, được gán cho phiên bản.

from typing import NamedTuple


class User(NamedTuple):
    name: str


class MyStruct(NamedTuple):
    foo: str
    bar: int
    baz: list
    qux: User


my_item = MyStruct('foo', 0, ['baz'], User('peter'))

print(my_item) # MyStruct(foo='foo', bar=0, baz=['baz'], qux=User(name='peter'))
6

Một cuộc biểu tình nhanh chóng. Lưu ý rằng tôi sử dụng đối số vị trí

m = MyStruct(field1="foo", field2="bar", field3="baz")
4, sử dụng giá trị mặc định cho
m = MyStruct(field1="foo", field2="bar", field3="baz")
5 và đối số được đặt tên
m = MyStruct(field1="foo", field2="bar", field3="baz")
6. Sau đó, tôi in tất cả 3 tham chiếu
m = MyStruct(field1="foo", field2="bar", field3="baz")
7, để cho thấy rằng chúng đã được chỉ định đúng trước khi nhập phương thức.

from typing import NamedTuple


class User(NamedTuple):
    name: str


class MyStruct(NamedTuple):
    foo: str
    bar: int
    baz: list
    qux: User


my_item = MyStruct('foo', 0, ['baz'], User('peter'))

print(my_item) # MyStruct(foo='foo', bar=0, baz=['baz'], qux=User(name='peter'))
7

Lưu ý rằng người trang trí của tôi nên làm việc với bất kỳ phương pháp nào, không chỉ

m = MyStruct(field1="foo", field2="bar", field3="baz")
3.

Đã trả lời ngày 8 tháng 9 năm 2015 lúc 2:38Sep 8, 2015 at 2:38

Hướng dẫn can you use structs in python? - bạn có thể sử dụng cấu trúc trong python không?

ArtofwarfareartofwarfareArtOfWarfare

Huy hiệu vàng 19.6K1717 gold badges130 silver badges188 bronze badges

Tôi không thấy câu trả lời này ở đây, vì vậy tôi nghĩ rằng tôi sẽ thêm nó vì tôi đang nghiêng Python ngay bây giờ và chỉ phát hiện ra nó. Hướng dẫn Python (Python 2 trong trường hợp này) đưa ra ví dụ đơn giản và hiệu quả sau:

from typing import NamedTuple


class User(NamedTuple):
    name: str


class MyStruct(NamedTuple):
    foo: str
    bar: int
    baz: list
    qux: User


my_item = MyStruct('foo', 0, ['baz'], User('peter'))

print(my_item) # MyStruct(foo='foo', bar=0, baz=['baz'], qux=User(name='peter'))
8

Nghĩa là, một đối tượng lớp trống được tạo, sau đó khởi tạo và các trường được thêm vào một cách linh hoạt.

Mặt trái của điều này là thực sự đơn giản của nó. Nhược điểm là nó không đặc biệt tự ghi chép (các thành viên dự định không được liệt kê ở bất cứ đâu trong lớp "Định nghĩa") và các trường không đặt có thể gây ra vấn đề khi được truy cập. Hai vấn đề đó có thể được giải quyết bằng cách:

from typing import NamedTuple


class User(NamedTuple):
    name: str


class MyStruct(NamedTuple):
    foo: str
    bar: int
    baz: list
    qux: User


my_item = MyStruct('foo', 0, ['baz'], User('peter'))

print(my_item) # MyStruct(foo='foo', bar=0, baz=['baz'], qux=User(name='peter'))
9

Bây giờ trong nháy mắt, bạn ít nhất có thể thấy những trường mà chương trình sẽ mong đợi.

Cả hai đều dễ bị lỗi lỗi,

m = MyStruct(field1="foo", field2="bar", field3="baz")
9 sẽ thành công. Tuy nhiên, nó hoạt động.

Đã trả lời ngày 8 tháng 11 năm 2016 lúc 14:06Nov 8, 2016 at 14:06

Hướng dẫn can you use structs in python? - bạn có thể sử dụng cấu trúc trong python không?

Jason Cjason cJason C

36.7K14 Huy hiệu vàng116 Huy hiệu bạc166 Huy hiệu đồng14 gold badges116 silver badges166 bronze badges

Dưới đây là một giải pháp sử dụng một lớp (không bao giờ được khởi tạo) để giữ dữ liệu. Tôi thích cách này liên quan đến rất ít gõ và không yêu cầu bất kỳ gói bổ sung nào, v.v.

from collections import namedtuple
MyStruct = namedtuple("MyStruct", "field1 field2 field3")
0

Bạn có thể thêm nhiều trường sau này, khi cần thiết:

from collections import namedtuple
MyStruct = namedtuple("MyStruct", "field1 field2 field3")
1

Để có được các giá trị, các trường được truy cập như bình thường:

from collections import namedtuple
MyStruct = namedtuple("MyStruct", "field1 field2 field3")
2

Đã trả lời ngày 9 tháng 4 năm 2019 lúc 11:10Apr 9, 2019 at 11:10

Jochenjochenjochen

3,4932 huy hiệu vàng37 Huy hiệu bạc47 Huy hiệu đồng2 gold badges37 silver badges47 bronze badges

4

Cá nhân, tôi cũng thích biến thể này. Nó mở rộng câu trả lời của @df.

from collections import namedtuple
MyStruct = namedtuple("MyStruct", "field1 field2 field3")
3

Nó hỗ trợ hai chế độ khởi tạo (có thể được pha trộn):

from collections import namedtuple
MyStruct = namedtuple("MyStruct", "field1 field2 field3")
4

Ngoài ra, nó in đẹp hơn:

from collections import namedtuple
MyStruct = namedtuple("MyStruct", "field1 field2 field3")
5

Đã trả lời ngày 6 tháng 11 năm 2017 lúc 15:38Nov 6, 2017 at 15:38

Normaniusnormaniusnormanius

7.2104 Huy hiệu vàng45 Huy hiệu bạc77 Huy hiệu đồng4 gold badges45 silver badges77 bronze badges

Có một gói Python chính xác cho mục đích này. Xem cstruct2py

>>> class Bunch:
...     def __init__(self, **kwds):
...         self.__dict__.update(kwds)
...
>>> mystruct = Bunch(field1=value1, field2=value2)
0 là một thư viện Python thuần túy để tạo các lớp Python từ mã C và sử dụng chúng để đóng gói và giải nén dữ liệu. Thư viện có thể phân tích các đầu C (cấu trúc, công đoàn, enum và khai báo mảng) và mô phỏng chúng trong Python. Các lớp Pythonic được tạo có thể phân tích và đóng gói dữ liệu.

Ví dụ:

from collections import namedtuple
MyStruct = namedtuple("MyStruct", "field1 field2 field3")
6

Cách sử dụng

Đầu tiên chúng ta cần tạo các cấu trúc pythonic:

from collections import namedtuple
MyStruct = namedtuple("MyStruct", "field1 field2 field3")
7

Bây giờ chúng tôi có thể nhập tất cả các tên từ mã C:

from collections import namedtuple
MyStruct = namedtuple("MyStruct", "field1 field2 field3")
8

Chúng ta cũng có thể làm điều đó trực tiếp:

from collections import namedtuple
MyStruct = namedtuple("MyStruct", "field1 field2 field3")
9

Sử dụng các loại và xác định từ mã c

m = MyStruct("foo", "bar", "baz")
0

Đầu ra sẽ là:

m = MyStruct("foo", "bar", "baz")
1

Dòng vô tính

Cho bản sao

>>> class Bunch:
...     def __init__(self, **kwds):
...         self.__dict__.update(kwds)
...
>>> mystruct = Bunch(field1=value1, field2=value2)
0 chạy:

m = MyStruct("foo", "bar", "baz")
2

Đã trả lời ngày 11 tháng 12 năm 2018 lúc 9:34Dec 11, 2018 at 9:34

0

Đây là một thủ thuật nhanh chóng và bẩn thỉu:

m = MyStruct("foo", "bar", "baz")
3

Nó làm việc như thế nào? Nó chỉ sử dụng lại lớp xây dựng

>>> class Bunch:
...     def __init__(self, **kwds):
...         self.__dict__.update(kwds)
...
>>> mystruct = Bunch(field1=value1, field2=value2)
2 (có nguồn gốc từ
>>> class Bunch:
...     def __init__(self, **kwds):
...         self.__dict__.update(kwds)
...
>>> mystruct = Bunch(field1=value1, field2=value2)
3) và sử dụng nó vì nó là lớp xác định của bạn.

Điểm tốt là bạn không cần nhập hoặc xác định bất cứ điều gì trước tiên, rằng "cảnh báo" là một tên ngắn và nó cũng cho thấy rõ bạn đang làm một cái gì đó bẩn không nên sử dụng ở nơi khác ngoài một kịch bản nhỏ của bạn.

Nhân tiện, tôi đã cố gắng tìm một thứ gì đó thậm chí đơn giản hơn như

>>> class Bunch:
...     def __init__(self, **kwds):
...         self.__dict__.update(kwds)
...
>>> mystruct = Bunch(field1=value1, field2=value2)
4 nhưng không thể (ví dụ cuối cùng này không hoạt động). Nếu bạn có một, tôi quan tâm.

Đã trả lời ngày 26 tháng 9 năm 2019 lúc 13:56Sep 26, 2019 at 13:56

Calandoacalandoacalandoa

5.3482 Huy hiệu vàng25 Huy hiệu bạc24 Huy hiệu đồng2 gold badges25 silver badges24 bronze badges

0

Được đặt tên là thoải mái. Nhưng không ai chia sẻ hiệu suất và lưu trữ.

m = MyStruct("foo", "bar", "baz")
4
m = MyStruct("foo", "bar", "baz")
5

Nếu

>>> class Bunch:
...     def __init__(self, **kwds):
...         self.__dict__.update(kwds)
...
>>> mystruct = Bunch(field1=value1, field2=value2)
5 của bạn không sử dụng, vui lòng chọn giữa
>>> class Bunch:
...     def __init__(self, **kwds):
...         self.__dict__.update(kwds)
...
>>> mystruct = Bunch(field1=value1, field2=value2)
6 (hiệu suất và lưu trữ cao hơn) và
>>> class Bunch:
...     def __init__(self, **kwds):
...         self.__dict__.update(kwds)
...
>>> mystruct = Bunch(field1=value1, field2=value2)
7 (rõ ràng để đọc và sử dụng)

Bạn có thể xem lại liên kết này (việc sử dụng các khe cắm) để có thêm thông tin

>>> class Bunch:
...     def __init__(self, **kwds):
...         self.__dict__.update(kwds)
...
>>> mystruct = Bunch(field1=value1, field2=value2)
6.slots) to get more
>>> class Bunch:
...     def __init__(self, **kwds):
...         self.__dict__.update(kwds)
...
>>> mystruct = Bunch(field1=value1, field2=value2)
6 information.

Đã trả lời ngày 5 tháng 6 năm 2020 lúc 10:05Jun 5, 2020 at 10:05

Hướng dẫn can you use structs in python? - bạn có thể sử dụng cấu trúc trong python không?

CarsonCarsonCarson

4.4622 Huy hiệu vàng28 Huy hiệu bạc37 Huy hiệu đồng2 gold badges28 silver badges37 bronze badges

https://stackoverflow.com/a/32448434/159695 không hoạt động trong Python3.

https://stackoverflow.com/a/35993/159695 hoạt động trong Python3.

Và tôi mở rộng nó để thêm các giá trị mặc định.

m = MyStruct("foo", "bar", "baz")
6

Đã trả lời ngày 30 tháng 10 năm 2017 lúc 13:40Oct 30, 2017 at 13:40

GalaxygalaxyGalaxy

1.7521 Huy hiệu vàng15 Huy hiệu bạc25 Huy hiệu Đồng1 gold badge15 silver badges25 bronze badges

1

Giải pháp sau đây cho một cấu trúc được lấy cảm hứng từ việc triển khai được đặt tên và một số câu trả lời trước đó. Tuy nhiên, không giống như tên gọi là nó có thể thay đổi, trong các giá trị của nó, nhưng giống như cấu trúc kiểu C bất biến trong các tên/thuộc tính, mà một lớp bình thường hoặc dict không.

m = MyStruct("foo", "bar", "baz")
7

Usage:

m = MyStruct("foo", "bar", "baz")
8

Đã trả lời ngày 29 tháng 3 năm 2018 lúc 16:25Mar 29, 2018 at 16:25

Nếu bạn không có 3.7 cho @Dataclass và cần tính đột biến, mã sau có thể hoạt động cho bạn. Nó khá tự ghi nhớ và thân thiện với IDE (tự động hoàn thành), ngăn chặn việc viết mọi thứ hai lần, có thể dễ dàng mở rộng và rất đơn giản để kiểm tra rằng tất cả các biến thể hiện được khởi tạo hoàn toàn:

m = MyStruct("foo", "bar", "baz")
9

Đã trả lời ngày 28 tháng 1 năm 2019 lúc 11:27Jan 28, 2019 at 11:27

Hướng dẫn can you use structs in python? - bạn có thể sử dụng cấu trúc trong python không?

Gebbissimogebbissimogebbissimo

1.6822 Huy hiệu vàng21 Huy hiệu bạc 30 Huy hiệu Đồng2 gold badges21 silver badges30 bronze badges

Cách tốt nhất tôi tìm thấy để làm điều này là sử dụng một lớp từ điển tùy chỉnh như được giải thích trong bài đăng này: https://stackoverflow.com/a/14620633/8484485

Nếu cần tự động hoàn thành ipython, chỉ cần xác định hàm dir () như thế này:dir() function like this:

m = MyStruct(field1="foo", field2="bar", field3="baz")
0

Sau đó, bạn xác định cấu trúc giả của bạn như vậy: (cái này được lồng)

m = MyStruct(field1="foo", field2="bar", field3="baz")
1

Sau đó, bạn có thể truy cập các giá trị bên trong my_struct như thế này:

>>> class Bunch:
...     def __init__(self, **kwds):
...         self.__dict__.update(kwds)
...
>>> mystruct = Bunch(field1=value1, field2=value2)
9

=>

class Sample:
  name = ''
  average = 0.0
  values = None # list cannot be initialized here!


s1 = Sample()
s1.name = "sample 1"
s1.values = []
s1.values.append(1)
s1.values.append(2)
s1.values.append(3)

s2 = Sample()
s2.name = "sample 2"
s2.values = []
s2.values.append(4)

for v in s1.values:   # prints 1,2,3 --> OK.
  print v
print "***"
for v in s2.values:   # prints 4 --> OK.
  print v
0

Hướng dẫn can you use structs in python? - bạn có thể sử dụng cấu trúc trong python không?

HALFER

Huy hiệu vàng 19.6K1717 gold badges92 silver badges176 bronze badges

Đã trả lời ngày 7 tháng 5 năm 2020 lúc 14:23May 7, 2020 at 14:23

Hướng dẫn can you use structs in python? - bạn có thể sử dụng cấu trúc trong python không?

TionebtionebTioneb

3362 Huy hiệu bạc5 Huy hiệu Đồng2 silver badges5 bronze badges

Tôi nghĩ từ điển cấu trúc Python phù hợp cho yêu cầu này.

m = MyStruct(field1="foo", field2="bar", field3="baz")
2

Đã trả lời ngày 8 tháng 7 năm 2017 lúc 19:17Jul 8, 2017 at 19:17

Có một cấu trúc tương đương trong Python?

Python không chính xác có điều tương tự như một cấu trúc trong Matlab. Bạn có thể đạt được một cái gì đó giống như nó bằng cách xác định một lớp trống và sau đó xác định các thuộc tính của lớp. Bạn có thể kiểm tra xem một đối tượng có thuộc tính cụ thể sử dụng HasAttr không.. You can achieve something like it by defining an empty class and then defining attributes of the class. You can check if an object has a particular attribute using hasattr.

Có phải cấu trúc trong C giống như lớp trong Python?

Sự khác biệt lớn là trong Python (và các ngôn ngữ định hướng đối tượng khác như C ++, Java hoặc C#), một lớp cũng có thể có các hàm liên quan đến nó chỉ hoạt động trên thể hiện của lớp, trong khi ở C, một hàm mong muốn Để hoạt động trên một cấu trúc phải chấp nhận cấu trúc như một tham số theo một cách nào đó, ...

Làm thế nào để bạn xác định một cấu trúc trong Python?

Một cấu trúc dữ liệu cho phép dữ liệu được thêm, loại bỏ, lưu trữ và duy trì theo cách có cấu trúc.Python hỗ trợ hai loại cấu trúc dữ liệu: Các loại dữ liệu không định tuyến: Python có danh sách, bộ và từ điển là các loại dữ liệu không nguyên thủy của nó cũng có thể được coi là cấu trúc dữ liệu được xây dựng của nó.

Làm thế nào để bạn sử dụng các cấu trúc dữ liệu trong Python?

Giống như một danh sách, một tuple cũng có thể chứa các yếu tố của nhiều loại khác nhau.Trong Python, các bộ dữ liệu được tạo ra bằng cách đặt một chuỗi các giá trị được phân tách bằng 'dấu phẩy' có hoặc không sử dụng dấu ngoặc đơn để nhóm chuỗi dữ liệu.Lưu ý: Bộ dữ liệu cũng có thể được tạo với một phần tử duy nhất, nhưng nó hơi khó khăn.tuples are created by placing a sequence of values separated by 'comma' with or without the use of parentheses for grouping of the data sequence. Note: Tuples can also be created with a single element, but it is a bit tricky.