You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.4 KiB
Markdown
71 lines
1.4 KiB
Markdown
9 months ago
|
# PyTraits
|
||
|
|
||
|
## Introduction
|
||
|
|
||
|
PyTraits is a Python library that provides functionality similar to Rust traits. It allows you to define protocols
|
||
|
using `impl` or `trait` annotations to specify the behavior that classes should implement.
|
||
|
|
||
|
## Installation
|
||
|
|
||
|
You can install PyTraits using pip:
|
||
|
|
||
|
```bash
|
||
|
pip install pytraits
|
||
|
```
|
||
|
|
||
|
## Usage
|
||
|
|
||
|
To use PyTraits, first, you need to define a protocol using the `runtime_checkable` annotation:
|
||
|
|
||
|
```python
|
||
|
from typing import runtime_checkable
|
||
|
|
||
|
|
||
|
@runtime_checkable
|
||
|
class Printable:
|
||
|
def print(self):
|
||
|
pass
|
||
|
```
|
||
|
|
||
|
Then, you can use the `impl` annotation to implement the protocol for a class:
|
||
|
|
||
|
|
||
|
```python
|
||
|
from pytraits import impl, trait
|
||
|
|
||
|
|
||
|
class MyClass1: pass
|
||
|
|
||
|
|
||
|
@impl(Printable)
|
||
|
class MyClassImplPrintable(MyClass1):
|
||
|
def print(self):
|
||
|
print("从 MyClass 打印")
|
||
|
|
||
|
|
||
|
class MyClass2: pass
|
||
|
|
||
|
|
||
|
@trait
|
||
|
class MyClassTraitPrintable(MyClass2, Printable):
|
||
|
def print(self):
|
||
|
print("从 MyClass2 打印")
|
||
|
|
||
|
|
||
|
mc1: MyClass1 | Printable = MyClass1()
|
||
|
mc2: MyClass2 | Printable = MyClass2()
|
||
|
mc1.print()
|
||
|
mc2.print()
|
||
|
```
|
||
|
|
||
|
Now, `MyClass` implements the `Printable` protocol and can be used accordingly.
|
||
|
|
||
|
|
||
|
## Contributing
|
||
|
|
||
|
Contributions are welcome! If you find any issues or have suggestions for improvement, please open an issue or submit a pull request on GitHub.
|
||
|
|
||
|
## License
|
||
|
|
||
|
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|